VirtualBox

Changeset 86576 in vbox for trunk


Ignore:
Timestamp:
Oct 14, 2020 3:09:53 PM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
140931
Message:

3D: Clarify shader version

Location:
trunk/src/VBox/Devices/Graphics
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-hlp.cpp

    r86024 r86576  
    1818#define LOG_GROUP LOG_GROUP_DEV_VMSVGA
    1919#include <VBox/AssertGuest.h>
    20 #include <VBox/log.h>
     20
     21#ifdef SHADER_VERIFY_STANDALONE
     22# include <stdio.h>
     23# define Log3(a) printf a
     24# define LogRel(a) printf a
     25#else
     26# include <VBox/log.h>
     27#endif
    2128
    2229#include <iprt/cdefs.h>
    2330#include <iprt/errcore.h>
    2431#include <iprt/types.h>
    25 
    26 #include "DevVGA-SVGA.h"
    27 
     32#include <iprt/string.h>
     33
     34#include "svga3d_reg.h"
     35#include "svga3d_shaderdefs.h"
     36
     37 /** Per shader data is stored in this structure. */
    2838typedef struct VMSVGA3DSHADERPARSECONTEXT
    2939{
    30     uint32_t type;
     40    /** Version token. */
     41    SVGA3dShaderVersion version;
    3142} VMSVGA3DSHADERPARSECONTEXT;
     43
     44/** Callback which parses a parameter token.
     45 *
     46 * @param pCtx     The shader data.
     47 * @param Op       Instruction opcode which the token is used with.
     48 * @param Token    The parameter token which must be parsed.
     49 * @param idxToken Index of the parameter token in the instruction. 0 for the first parameter.
     50 *
     51 * @return VBox error code.
     52 */
     53typedef int FNSHADERPARSETOKEN(VMSVGA3DSHADERPARSECONTEXT* pCtx, uint32_t Op, uint32_t Token, uint32_t idxToken);
     54typedef FNSHADERPARSETOKEN* PFNSHADERPARSETOKEN;
     55
     56/** Information about a shader opcode. */
     57typedef struct VMSVGA3DSHADERPARSEOP
     58{
     59    /** Opcode. */
     60    SVGA3dShaderOpCodeType Op;
     61    /** Maximum number of parameters. */
     62    uint32_t Length;
     63    /** Pointer to callback, which parse each parameter.
     64     * The size is the number of maximum possible parameters: dest + 3 * src
     65     */
     66    PFNSHADERPARSETOKEN apfnParse[4];
     67} VMSVGA3DSHADERPARSEOP;
    3268
    3369static int vmsvga3dShaderParseRegOffset(VMSVGA3DSHADERPARSECONTEXT *pCtx,
     
    89125}
    90126
    91 #if 0
    92 static int vmsvga3dShaderParseSrcToken(VMSVGA3DSHADERPARSECONTEXT *pCtx, uint32_t const *pToken)
    93 {
    94     RT_NOREF(pCtx);
     127/* Parse a declaration parameter token:
     128 * https://docs.microsoft.com/en-us/windows-hardware/drivers/display/dcl-instruction
     129 *
     130 * See FNSHADERPARSETOKEN.
     131 */
     132static int vmsvga3dShaderParseDclToken(VMSVGA3DSHADERPARSECONTEXT* pCtx, uint32_t Op, uint32_t Token, uint32_t idxToken)
     133{
     134    RT_NOREF(pCtx, Op, Token, idxToken);
     135    return VINF_SUCCESS;
     136}
     137
     138/* Parse a label (D3DSPR_LABEL) parameter token.
     139 *
     140 * See FNSHADERPARSETOKEN.
     141 */
     142static int vmsvga3dShaderParseLabelToken(VMSVGA3DSHADERPARSECONTEXT* pCtx, uint32_t Op, uint32_t Token, uint32_t idxToken)
     143{
     144    RT_NOREF(pCtx, Op, Token, idxToken);
     145    return VINF_SUCCESS;
     146}
     147
     148/* Parse a destination parameter token:
     149 * https://docs.microsoft.com/en-us/windows-hardware/drivers/display/destination-parameter-token
     150 * See FNSHADERPARSETOKEN.
     151 */
     152static int vmsvga3dShaderParseDestToken(VMSVGA3DSHADERPARSECONTEXT* pCtx, uint32_t Op, uint32_t Token, uint32_t idxToken)
     153{
     154    RT_NOREF(pCtx, Op, idxToken);
     155
     156    SVGA3dShaderDestToken dest;
     157    dest.value = Token;
     158
     159    SVGA3dShaderRegType const regType = (SVGA3dShaderRegType)(dest.type_upper << 3 | dest.type_lower);
     160    Log3(("Dest: type %d, r0 %d, shfScale %d, dstMod %d, mask 0x%x, r1 %d, relAddr %d, num %d\n",
     161        regType, dest.reserved0, dest.shfScale, dest.dstMod, dest.mask, dest.reserved1, dest.relAddr, dest.num));
     162
     163    return vmsvga3dShaderParseRegOffset(pCtx, false, regType, dest.num);
     164}
     165
     166/* Parse a source parameter token:
     167 * https://docs.microsoft.com/en-us/windows-hardware/drivers/display/source-parameter-token
     168 * See FNSHADERPARSETOKEN.
     169 */
     170static int vmsvga3dShaderParseSrcToken(VMSVGA3DSHADERPARSECONTEXT* pCtx, uint32_t Op, uint32_t Token, uint32_t idxToken)
     171{
     172    RT_NOREF(pCtx, Op, idxToken);
    95173
    96174    SVGA3dShaderSrcToken src;
    97     src.value = *pToken;
     175    src.value = Token;
    98176
    99177    SVGA3dShaderRegType const regType = (SVGA3dShaderRegType)(src.type_upper << 3 | src.type_lower);
    100178    Log3(("Src: type %d, r0 %d, srcMod %d, swizzle 0x%x, r1 %d, relAddr %d, num %d\n",
    101           regType, src.reserved0, src.srcMod, src.swizzle, src.reserved1, src.relAddr, src.num));
     179        regType, src.reserved0, src.srcMod, src.swizzle, src.reserved1, src.relAddr, src.num));
    102180
    103181    return vmsvga3dShaderParseRegOffset(pCtx, true, regType, src.num);
    104182}
    105 #endif
    106 
    107 static int vmsvga3dShaderParseDestToken(VMSVGA3DSHADERPARSECONTEXT *pCtx, uint32_t const *pToken)
    108 {
    109     RT_NOREF(pCtx);
    110 
    111     SVGA3dShaderDestToken dest;
    112     dest.value = *pToken;
    113 
    114     SVGA3dShaderRegType const regType = (SVGA3dShaderRegType)(dest.type_upper << 3 | dest.type_lower);
    115     Log3(("Dest: type %d, r0 %d, shfScale %d, dstMod %d, mask 0x%x, r1 %d, relAddr %d, num %d\n",
    116           regType, dest.reserved0, dest.shfScale, dest.dstMod, dest.mask, dest.reserved1, dest.relAddr, dest.num));
    117 
    118     return vmsvga3dShaderParseRegOffset(pCtx, false, regType, dest.num);
    119 }
    120 
    121 static int vmsvga3dShaderParseDclArgs(VMSVGA3DSHADERPARSECONTEXT *pCtx, uint32_t const *pToken)
    122 {
    123     SVGA3DOpDclArgs a;
    124     a.values[0] = pToken[0]; // declaration
    125     a.values[1] = pToken[1]; // dst
    126 
    127     return vmsvga3dShaderParseDestToken(pCtx, (uint32_t *)&a.dst);
    128 }
     183
     184/* Shortcut defines. */
     185#define PT_DCL  vmsvga3dShaderParseDclToken
     186#define PT_LBL  vmsvga3dShaderParseLabelToken
     187#define PT_DEST vmsvga3dShaderParseDestToken
     188#define PT_SRC  vmsvga3dShaderParseSrcToken
     189
     190/* Information about opcodes:
     191 * https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/d3d9types/ne-d3d9types-_d3dshader_instruction_opcode_type
     192 */
     193static const VMSVGA3DSHADERPARSEOP aOps[] =
     194{
     195    /*         Op                Length    Parameters */
     196    /* 00 */ { SVGA3DOP_NOP,          0, { NULL,    NULL,    NULL,    NULL    } },
     197    /* 01 */ { SVGA3DOP_MOV,          2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     198    /* 02 */ { SVGA3DOP_ADD,          3, { PT_DEST, PT_SRC,  PT_SRC,  NULL    } },
     199    /* 03 */ { SVGA3DOP_SUB,          3, { PT_DEST, PT_SRC,  PT_SRC,  NULL    } },
     200    /* 04 */ { SVGA3DOP_MAD,          4, { PT_DEST, PT_SRC,  PT_SRC,  PT_SRC  } },
     201    /* 05 */ { SVGA3DOP_MUL,          3, { PT_DEST, PT_SRC,  PT_SRC,  NULL    } },
     202    /* 06 */ { SVGA3DOP_RCP,          2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     203    /* 07 */ { SVGA3DOP_RSQ,          2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     204    /* 08 */ { SVGA3DOP_DP3,          3, { PT_DEST, PT_SRC,  PT_SRC,  NULL    } },
     205    /* 09 */ { SVGA3DOP_DP4,          3, { PT_DEST, PT_SRC,  PT_SRC,  NULL    } },
     206    /* 10 */ { SVGA3DOP_MIN,          3, { PT_DEST, PT_SRC,  PT_SRC,  NULL    } },
     207    /* 11 */ { SVGA3DOP_MAX,          3, { PT_DEST, PT_SRC,  PT_SRC,  NULL    } },
     208    /* 12 */ { SVGA3DOP_SLT,          3, { PT_DEST, PT_SRC,  PT_SRC,  NULL    } },
     209    /* 13 */ { SVGA3DOP_SGE,          3, { PT_DEST, PT_SRC,  PT_SRC,  NULL    } },
     210    /* 14 */ { SVGA3DOP_EXP,          2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     211    /* 15 */ { SVGA3DOP_LOG,          2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     212    /* 16 */ { SVGA3DOP_LIT,          2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     213    /* 17 */ { SVGA3DOP_DST,          3, { PT_DEST, PT_SRC,  PT_SRC,  NULL    } },
     214    /* 18 */ { SVGA3DOP_LRP,          4, { PT_DEST, PT_SRC,  PT_SRC,  PT_SRC  } },
     215    /* 19 */ { SVGA3DOP_FRC,          3, { PT_DEST, PT_SRC,  PT_SRC,  NULL    } },
     216    /* 20 */ { SVGA3DOP_M4x4,         3, { PT_DEST, PT_SRC,  PT_SRC,  NULL    } },
     217    /* 21 */ { SVGA3DOP_M4x3,         3, { PT_DEST, PT_SRC,  PT_SRC,  NULL    } },
     218    /* 22 */ { SVGA3DOP_M3x4,         3, { PT_DEST, PT_SRC,  PT_SRC,  NULL    } },
     219    /* 23 */ { SVGA3DOP_M3x3,         3, { PT_DEST, PT_SRC,  PT_SRC,  NULL    } },
     220    /* 24 */ { SVGA3DOP_M3x2,         3, { PT_DEST, PT_SRC,  PT_SRC,  NULL    } },
     221    /* 25 */ { SVGA3DOP_CALL,         1, { PT_LBL,  NULL,    NULL,    NULL    } },
     222    /* 26 */ { SVGA3DOP_CALLNZ,       2, { PT_LBL,  PT_SRC,  NULL,    NULL    } },
     223    /* 27 */ { SVGA3DOP_LOOP,         1, { PT_SRC,  NULL,    NULL,    NULL    } },
     224    /* 28 */ { SVGA3DOP_RET,          0, { NULL,    NULL,    NULL,    NULL    } },
     225    /* 29 */ { SVGA3DOP_ENDLOOP,      0, { NULL,    NULL,    NULL,    NULL    } },
     226    /* 30 */ { SVGA3DOP_LABEL,        1, { PT_LBL,  NULL,    NULL,    NULL    } },
     227    /* 31 */ { SVGA3DOP_DCL,          2, { PT_DCL,  PT_DEST, NULL,    NULL    } },
     228    /* 32 */ { SVGA3DOP_POW,          3, { PT_DEST, PT_SRC,  PT_SRC,  NULL    } },
     229    /* 33 */ { SVGA3DOP_CRS,          3, { PT_DEST, PT_SRC,  PT_SRC,  NULL    } },
     230    /* 34 */ { SVGA3DOP_SGN,          4, { PT_DEST, PT_SRC,  PT_SRC,  PT_SRC  } },
     231    /* 35 */ { SVGA3DOP_ABS,          2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     232    /* 36 */ { SVGA3DOP_NRM,          2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     233    /* 37 */ { SVGA3DOP_SINCOS,       4, { PT_DEST, PT_SRC,  PT_SRC,  PT_SRC  } },
     234    /* 38 */ { SVGA3DOP_REP,          1, { PT_SRC,  NULL,    NULL,    NULL    } },
     235    /* 39 */ { SVGA3DOP_ENDREP,       0, { NULL,    NULL,    NULL,    NULL    } },
     236    /* 40 */ { SVGA3DOP_IF,           1, { PT_SRC,  NULL,    NULL,    NULL    } },
     237    /* 41 */ { SVGA3DOP_IFC,          2, { PT_SRC,  PT_SRC,  NULL,    NULL    } },
     238    /* 42 */ { SVGA3DOP_ELSE,         0, { NULL,    NULL,    NULL,    NULL    } },
     239    /* 43 */ { SVGA3DOP_ENDIF,        0, { NULL,    NULL,    NULL,    NULL    } },
     240    /* 44 */ { SVGA3DOP_BREAK,        0, { NULL,    NULL,    NULL,    NULL    } },
     241    /* 45 */ { SVGA3DOP_BREAKC,       2, { PT_SRC,  PT_SRC,  NULL,    NULL    } },
     242    /* 46 */ { SVGA3DOP_MOVA,         2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     243    /* 47 */ { SVGA3DOP_DEFB,         2, { PT_DEST, NULL,    NULL,    NULL    } },
     244    /* 48 */ { SVGA3DOP_DEFI,         5, { PT_DEST, NULL,    NULL,    NULL    } },
     245    /* 49 */ { SVGA3DOP_NOP,          0, { NULL,    NULL,    NULL,    NULL    } },
     246    /* 50 */ { SVGA3DOP_NOP,          0, { NULL,    NULL,    NULL,    NULL    } },
     247    /* 51 */ { SVGA3DOP_NOP,          0, { NULL,    NULL,    NULL,    NULL    } },
     248    /* 52 */ { SVGA3DOP_NOP,          0, { NULL,    NULL,    NULL,    NULL    } },
     249    /* 53 */ { SVGA3DOP_NOP,          0, { NULL,    NULL,    NULL,    NULL    } },
     250    /* 54 */ { SVGA3DOP_NOP,          0, { NULL,    NULL,    NULL,    NULL    } },
     251    /* 55 */ { SVGA3DOP_NOP,          0, { NULL,    NULL,    NULL,    NULL    } },
     252    /* 56 */ { SVGA3DOP_NOP,          0, { NULL,    NULL,    NULL,    NULL    } },
     253    /* 57 */ { SVGA3DOP_NOP,          0, { NULL,    NULL,    NULL,    NULL    } },
     254    /* 58 */ { SVGA3DOP_NOP,          0, { NULL,    NULL,    NULL,    NULL    } },
     255    /* 59 */ { SVGA3DOP_NOP,          0, { NULL,    NULL,    NULL,    NULL    } },
     256    /* 60 */ { SVGA3DOP_NOP,          0, { NULL,    NULL,    NULL,    NULL    } },
     257    /* 61 */ { SVGA3DOP_NOP,          0, { NULL,    NULL,    NULL,    NULL    } },
     258    /* 62 */ { SVGA3DOP_NOP,          0, { NULL,    NULL,    NULL,    NULL    } },
     259    /* 63 */ { SVGA3DOP_NOP,          0, { NULL,    NULL,    NULL,    NULL    } },
     260    /* 64 */ { SVGA3DOP_TEXCOORD,     2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     261    /* 65 */ { SVGA3DOP_TEXKILL,      1, { PT_DEST, NULL,    NULL,    NULL    } },
     262    /* 66 */ { SVGA3DOP_TEX,          3, { PT_DEST, PT_SRC,  PT_SRC,  NULL    } }, // pre-1.4 = tex dest, post-1.4 = texld dest, src, src
     263    /* 67 */ { SVGA3DOP_TEXBEM,       2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     264    /* 68 */ { SVGA3DOP_TEXBEML,      2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     265    /* 69 */ { SVGA3DOP_TEXREG2AR,    2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     266    /* 70 */ { SVGA3DOP_TEXREG2GB,    2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     267    /* 71 */ { SVGA3DOP_TEXM3x2PAD,   2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     268    /* 72 */ { SVGA3DOP_TEXM3x2TEX,   2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     269    /* 73 */ { SVGA3DOP_TEXM3x3PAD,   2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     270    /* 74 */ { SVGA3DOP_TEXM3x3TEX,   2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     271    /* 75 */ { SVGA3DOP_RESERVED0,    0, { NULL,    NULL,    NULL,    NULL    } },
     272    /* 76 */ { SVGA3DOP_TEXM3x3SPEC,  3, { PT_DEST, PT_SRC,  PT_SRC,  NULL    } },
     273    /* 77 */ { SVGA3DOP_TEXM3x3VSPEC, 2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     274    /* 78 */ { SVGA3DOP_EXPP,         2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     275    /* 79 */ { SVGA3DOP_LOGP,         2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     276    /* 80 */ { SVGA3DOP_CND,          4, { PT_DEST, PT_SRC,  PT_SRC,  PT_SRC  } },
     277    /* 81 */ { SVGA3DOP_DEF,          5, { PT_DEST, NULL,    NULL,    NULL    } },
     278    /* 82 */ { SVGA3DOP_TEXREG2RGB,   2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     279    /* 83 */ { SVGA3DOP_TEXDP3TEX,    2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     280    /* 84 */ { SVGA3DOP_TEXM3x2DEPTH, 2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     281    /* 85 */ { SVGA3DOP_TEXDP3,       2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     282    /* 86 */ { SVGA3DOP_TEXM3x3,      2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     283    /* 87 */ { SVGA3DOP_TEXDEPTH,     1, { PT_DEST, NULL,    NULL,    NULL    } },
     284    /* 88 */ { SVGA3DOP_CMP,          4, { PT_DEST, PT_SRC,  PT_SRC,  PT_SRC  } },
     285    /* 89 */ { SVGA3DOP_BEM,          3, { PT_DEST, PT_SRC,  PT_SRC,  NULL    } },
     286    /* 90 */ { SVGA3DOP_DP2ADD,       4, { PT_DEST, PT_SRC,  PT_SRC,  PT_SRC  } },
     287    /* 91 */ { SVGA3DOP_DSX,          2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     288    /* 92 */ { SVGA3DOP_DSY,          2, { PT_DEST, PT_SRC,  NULL,    NULL    } },
     289    /* 93 */ { SVGA3DOP_TEXLDD,       3, { PT_DEST, PT_SRC,  PT_SRC,  NULL    } },
     290    /* 94 */ { SVGA3DOP_SETP,         3, { PT_DEST, PT_SRC,  PT_SRC,  NULL    } },
     291    /* 95 */ { SVGA3DOP_TEXLDL,       3, { PT_DEST, PT_SRC,  PT_SRC,  NULL    } },
     292    /* 96 */ { SVGA3DOP_BREAKP,       1, { PT_SRC,  NULL,    NULL,    NULL    } },
     293};
     294
     295#undef PT_DCL
     296#undef PT_LBL
     297#undef PT_DEST
     298#undef PT_SRC
    129299
    130300/* Parse the shader code
    131301 * https://docs.microsoft.com/en-us/windows-hardware/drivers/display/shader-code-format
    132302 */
    133 int vmsvga3dShaderParse(uint32_t cbShaderData, uint32_t const *pShaderData)
    134 {
    135     uint32_t const *paTokensStart = (uint32_t *)pShaderData;
     303int vmsvga3dShaderParse(SVGA3dShaderType type, uint32_t cbShaderData, uint32_t const* pShaderData)
     304{
     305    uint32_t const* paTokensStart = (uint32_t*)pShaderData;
    136306    uint32_t const cTokens = cbShaderData / sizeof(uint32_t);
    137307
    138     /* 48KB is an arbitrary limit. */
     308    ASSERT_GUEST_RETURN(cTokens * sizeof(uint32_t) == cbShaderData, VERR_INVALID_PARAMETER);
     309
     310    /* Need at least the version token and SVGA3DOP_END instruction token. 48KB is an arbitrary limit. */
    139311    ASSERT_GUEST_RETURN(cTokens >= 2 && cTokens < (48 * _1K) / sizeof(paTokensStart[0]), VERR_INVALID_PARAMETER);
    140312
     
    157329#endif
    158330
     331    VMSVGA3DSHADERPARSECONTEXT ctx;
     332    RT_ZERO(ctx);
     333
    159334    /* "The first token must be a version token." */
    160     SVGA3dShaderVersion const *pVersion = (SVGA3dShaderVersion const *)paTokensStart;
    161     ASSERT_GUEST_RETURN(   pVersion->type == SVGA3D_VS_TYPE
    162                         || pVersion->type == SVGA3D_PS_TYPE, VERR_PARSE_ERROR);
    163 
    164     VMSVGA3DSHADERPARSECONTEXT ctx;
    165     ctx.type = pVersion->type;
     335    ctx.version = *(SVGA3dShaderVersion*)paTokensStart;
     336    ASSERT_GUEST_RETURN(ctx.version.type == SVGA3D_VS_TYPE
     337        || ctx.version.type == SVGA3D_PS_TYPE, VERR_PARSE_ERROR);
     338    /* A vertex shader should not be defined with a pixel shader bytecode (and visa versa)*/
     339    ASSERT_GUEST_RETURN((ctx.version.type == SVGA3D_VS_TYPE && type == SVGA3D_SHADERTYPE_VS)
     340                     || (ctx.version.type == SVGA3D_PS_TYPE && type == SVGA3D_SHADERTYPE_PS), VERR_PARSE_ERROR);
     341    ASSERT_GUEST_RETURN(ctx.version.major >= 2 && ctx.version.major <= 4, VERR_PARSE_ERROR);
    166342
    167343    /* Scan the tokens. Immediately return an error code on any unexpected data. */
    168     const uint32_t *paTokensEnd = &paTokensStart[cTokens];
    169     const uint32_t *pToken = &paTokensStart[1];
     344    uint32_t const* paTokensEnd = &paTokensStart[cTokens];
     345    uint32_t const* pToken = &paTokensStart[1]; /* Skip the version token. */
     346    bool  bEndTokenFound = false;
    170347    while (pToken < paTokensEnd)
    171348    {
    172         SVGA3dShaderInstToken const token = *(SVGA3dShaderInstToken *)pToken;
     349        SVGA3dShaderInstToken const token = *(SVGA3dShaderInstToken*)pToken;
    173350
    174351        /* Figure out the instruction length, which is how many tokens follow the instruction token. */
    175         uint32_t cInstLen;
    176         if (token.op == SVGA3DOP_COMMENT)
    177             cInstLen = token.comment_size;
    178         else
    179             cInstLen = token.size;
     352        uint32_t const cInstLen = token.op == SVGA3DOP_COMMENT
     353            ? token.comment_size
     354            : token.size;
    180355
    181356        Log3(("op %d, cInstLen %d\n", token.op, cInstLen));
    182357
     358        /* Must not be greater than the number of remaining tokens. */
    183359        ASSERT_GUEST_RETURN(cInstLen < paTokensEnd - pToken, VERR_PARSE_ERROR);
    184360
     361        /* Stop parsing if this is the SVGA3DOP_END instruction. */
    185362        if (token.op == SVGA3DOP_END)
    186363        {
    187364            ASSERT_GUEST_RETURN(token.value == 0x0000FFFF, VERR_PARSE_ERROR);
     365            bEndTokenFound = true;
    188366            break;
    189367        }
    190368
    191         int rc;
    192         switch (token.op)
     369        /* If this instrution is in the aOps table. */
     370        if (token.op <= SVGA3DOP_BREAKP)
    193371        {
    194             case SVGA3DOP_DCL:
    195                 ASSERT_GUEST_RETURN(cInstLen == 2, VERR_PARSE_ERROR);
    196                 rc = vmsvga3dShaderParseDclArgs(&ctx, &pToken[1]);
     372            VMSVGA3DSHADERPARSEOP const* pOp = &aOps[token.op];
     373
     374            /* cInstLen can be greater than pOp->Length.
     375             * W10 guest sends a vertex shader MUL instruction with length 4.
     376             * So figure out the actual number of valid parameters.
     377             */
     378            uint32_t const cParams = RT_MIN(cInstLen, pOp->Length);
     379
     380            /* Parse paramater tokens. */
     381            uint32_t i;
     382            for (i = 0; i < RT_MIN(cParams, RT_ELEMENTS(pOp->apfnParse)); ++i)
     383            {
     384                if (!pOp->apfnParse[i])
     385                    continue;
     386
     387                int rc = pOp->apfnParse[i](&ctx, token.op, pToken[i + 1], i);
    197388                if (RT_FAILURE(rc))
    198389                    return rc;
    199                 break;
    200             case SVGA3DOP_NOP:
    201             case SVGA3DOP_MOV:
    202             case SVGA3DOP_ADD:
    203             case SVGA3DOP_SUB:
    204             case SVGA3DOP_MAD:
    205             case SVGA3DOP_MUL:
    206             case SVGA3DOP_RCP:
    207             case SVGA3DOP_RSQ:
    208             case SVGA3DOP_DP3:
    209             case SVGA3DOP_DP4:
    210             case SVGA3DOP_MIN:
    211             case SVGA3DOP_MAX:
    212             case SVGA3DOP_SLT:
    213             case SVGA3DOP_SGE:
    214             case SVGA3DOP_EXP:
    215             case SVGA3DOP_LOG:
    216             case SVGA3DOP_LIT:
    217             case SVGA3DOP_DST:
    218             case SVGA3DOP_LRP:
    219             case SVGA3DOP_FRC:
    220             case SVGA3DOP_M4x4:
    221             case SVGA3DOP_M4x3:
    222             case SVGA3DOP_M3x4:
    223             case SVGA3DOP_M3x3:
    224             case SVGA3DOP_M3x2:
    225             case SVGA3DOP_CALL:
    226             case SVGA3DOP_CALLNZ:
    227             case SVGA3DOP_LOOP:
    228             case SVGA3DOP_RET:
    229             case SVGA3DOP_ENDLOOP:
    230             case SVGA3DOP_LABEL:
    231             case SVGA3DOP_POW:
    232             case SVGA3DOP_CRS:
    233             case SVGA3DOP_SGN:
    234             case SVGA3DOP_ABS:
    235             case SVGA3DOP_NRM:
    236             case SVGA3DOP_SINCOS:
    237             case SVGA3DOP_REP:
    238             case SVGA3DOP_ENDREP:
    239             case SVGA3DOP_IF:
    240             case SVGA3DOP_IFC:
    241             case SVGA3DOP_ELSE:
    242             case SVGA3DOP_ENDIF:
    243             case SVGA3DOP_BREAK:
    244             case SVGA3DOP_BREAKC:
    245             case SVGA3DOP_MOVA:
    246             case SVGA3DOP_DEFB:
    247             case SVGA3DOP_DEFI:
    248             case SVGA3DOP_TEXCOORD:
    249             case SVGA3DOP_TEXKILL:
    250             case SVGA3DOP_TEX:
    251             case SVGA3DOP_TEXBEM:
    252             case SVGA3DOP_TEXBEML:
    253             case SVGA3DOP_TEXREG2AR:
    254             case SVGA3DOP_TEXREG2GB:
    255             case SVGA3DOP_TEXM3x2PAD:
    256             case SVGA3DOP_TEXM3x2TEX:
    257             case SVGA3DOP_TEXM3x3PAD:
    258             case SVGA3DOP_TEXM3x3TEX:
    259             case SVGA3DOP_RESERVED0:
    260             case SVGA3DOP_TEXM3x3SPEC:
    261             case SVGA3DOP_TEXM3x3VSPEC:
    262             case SVGA3DOP_EXPP:
    263             case SVGA3DOP_LOGP:
    264             case SVGA3DOP_CND:
    265             case SVGA3DOP_DEF:
    266             case SVGA3DOP_TEXREG2RGB:
    267             case SVGA3DOP_TEXDP3TEX:
    268             case SVGA3DOP_TEXM3x2DEPTH:
    269             case SVGA3DOP_TEXDP3:
    270             case SVGA3DOP_TEXM3x3:
    271             case SVGA3DOP_TEXDEPTH:
    272             case SVGA3DOP_CMP:
    273             case SVGA3DOP_BEM:
    274             case SVGA3DOP_DP2ADD:
    275             case SVGA3DOP_DSX:
    276             case SVGA3DOP_DSY:
    277             case SVGA3DOP_TEXLDD:
    278             case SVGA3DOP_SETP:
    279             case SVGA3DOP_TEXLDL:
    280             case SVGA3DOP_BREAKP:
    281             case SVGA3DOP_PHASE:
    282             case SVGA3DOP_COMMENT:
    283                 break;
    284 
    285             default:
    286                 ASSERT_GUEST_FAILED_RETURN(VERR_PARSE_ERROR);
     390            }
    287391        }
     392        else if (token.op == SVGA3DOP_PHASE
     393            || token.op == SVGA3DOP_COMMENT)
     394        {
     395        }
     396        else
     397            ASSERT_GUEST_FAILED_RETURN(VERR_PARSE_ERROR);
    288398
    289399        /* Next token. */
    290400        pToken += cInstLen + 1;
     401    }
     402
     403    if (!bEndTokenFound)
     404    {
     405        ASSERT_GUEST_FAILED_RETURN(VERR_PARSE_ERROR);
    291406    }
    292407
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-internal.h

    r86024 r86576  
    14251425#endif
    14261426
    1427 int vmsvga3dShaderParse(uint32_t cbShaderData, uint32_t const *pShaderData);
     1427int vmsvga3dShaderParse(SVGA3dShaderType type, uint32_t cbShaderData, uint32_t const *pShaderData);
    14281428void vmsvga3dShaderLogRel(char const *pszMsg, SVGA3dShaderType type, uint32_t cbShaderData, uint32_t const *pShaderData);
    14291429
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-ogl.cpp

    r86024 r86576  
    73347334    AssertReturn(shid < SVGA3D_MAX_SHADER_IDS, VERR_INVALID_PARAMETER);
    73357335
    7336     rc = vmsvga3dShaderParse(cbData, pShaderData);
     7336    rc = vmsvga3dShaderParse(type, cbData, pShaderData);
    73377337    if (RT_FAILURE(rc))
    73387338    {
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA3d-win.cpp

    r86024 r86576  
    55205520    AssertReturn(shid < SVGA3D_MAX_SHADER_IDS, VERR_INVALID_PARAMETER);
    55215521
    5522     rc = vmsvga3dShaderParse(cbData, pShaderData);
     5522    rc = vmsvga3dShaderParse(type, cbData, pShaderData);
    55235523    if (RT_FAILURE(rc))
    55245524    {
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette