ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

shader_sm4.c
Go to the documentation of this file.
00001 /*
00002  * Copyright 2009 Henri Verbeet for CodeWeavers
00003  *
00004  * This library is free software; you can redistribute it and/or
00005  * modify it under the terms of the GNU Lesser General Public
00006  * License as published by the Free Software Foundation; either
00007  * version 2.1 of the License, or (at your option) any later version.
00008  *
00009  * This library is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012  * Lesser General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU Lesser General Public
00015  * License along with this library; if not, write to the Free Software
00016  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00017  */
00018 
00019 #include "config.h"
00020 #include "wine/port.h"
00021 
00022 #include "wined3d_private.h"
00023 
00024 WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader);
00025 
00026 #define WINED3D_SM4_INSTRUCTION_MODIFIER        (1 << 31)
00027 
00028 #define WINED3D_SM4_INSTRUCTION_LENGTH_SHIFT    24
00029 #define WINED3D_SM4_INSTRUCTION_LENGTH_MASK     (0xf << WINED3D_SM4_INSTRUCTION_LENGTH_SHIFT)
00030 
00031 #define WINED3D_SM4_OPCODE_MASK                 0xff
00032 
00033 #define WINED3D_SM4_REGISTER_MODIFIER           (1 << 31)
00034 
00035 #define WINED3D_SM4_REGISTER_ORDER_SHIFT        20
00036 #define WINED3D_SM4_REGISTER_ORDER_MASK         (0x3 << WINED3D_SM4_REGISTER_ORDER_SHIFT)
00037 
00038 #define WINED3D_SM4_REGISTER_TYPE_SHIFT         12
00039 #define WINED3D_SM4_REGISTER_TYPE_MASK          (0xf << WINED3D_SM4_REGISTER_TYPE_SHIFT)
00040 
00041 #define WINED3D_SM4_IMMCONST_TYPE_SHIFT         0
00042 #define WINED3D_SM4_IMMCONST_TYPE_MASK          (0x3 << WINED3D_SM4_IMMCONST_TYPE_SHIFT)
00043 
00044 #define WINED3D_SM4_WRITEMASK_SHIFT             4
00045 #define WINED3D_SM4_WRITEMASK_MASK              (0xf << WINED3D_SM4_WRITEMASK_SHIFT)
00046 
00047 #define WINED3D_SM4_SWIZZLE_SHIFT               4
00048 #define WINED3D_SM4_SWIZZLE_MASK                (0xff << WINED3D_SM4_SWIZZLE_SHIFT)
00049 
00050 #define WINED3D_SM4_VERSION_MAJOR(version)      (((version) >> 4) & 0xf)
00051 #define WINED3D_SM4_VERSION_MINOR(version)      (((version) >> 0) & 0xf)
00052 
00053 enum wined3d_sm4_opcode
00054 {
00055     WINED3D_SM4_OP_ADD          = 0x00,
00056     WINED3D_SM4_OP_AND          = 0x01,
00057     WINED3D_SM4_OP_BREAK        = 0x02,
00058     WINED3D_SM4_OP_BREAKC       = 0x03,
00059     WINED3D_SM4_OP_CUT          = 0x09,
00060     WINED3D_SM4_OP_DERIV_RTX    = 0x0b,
00061     WINED3D_SM4_OP_DERIV_RTY    = 0x0c,
00062     WINED3D_SM4_OP_DIV          = 0x0e,
00063     WINED3D_SM4_OP_DP3          = 0x10,
00064     WINED3D_SM4_OP_DP4          = 0x11,
00065     WINED3D_SM4_OP_EMIT         = 0x13,
00066     WINED3D_SM4_OP_ENDIF        = 0x15,
00067     WINED3D_SM4_OP_ENDLOOP      = 0x16,
00068     WINED3D_SM4_OP_EQ           = 0x18,
00069     WINED3D_SM4_OP_EXP          = 0x19,
00070     WINED3D_SM4_OP_FRC          = 0x1a,
00071     WINED3D_SM4_OP_FTOI         = 0x1b,
00072     WINED3D_SM4_OP_GE           = 0x1d,
00073     WINED3D_SM4_OP_IADD         = 0x1e,
00074     WINED3D_SM4_OP_IF           = 0x1f,
00075     WINED3D_SM4_OP_IEQ          = 0x20,
00076     WINED3D_SM4_OP_IGE          = 0x21,
00077     WINED3D_SM4_OP_IMUL         = 0x26,
00078     WINED3D_SM4_OP_ITOF         = 0x2b,
00079     WINED3D_SM4_OP_LD           = 0x2d,
00080     WINED3D_SM4_OP_LOG          = 0x2f,
00081     WINED3D_SM4_OP_LOOP         = 0x30,
00082     WINED3D_SM4_OP_LT           = 0x31,
00083     WINED3D_SM4_OP_MAD          = 0x32,
00084     WINED3D_SM4_OP_MIN          = 0x33,
00085     WINED3D_SM4_OP_MAX          = 0x34,
00086     WINED3D_SM4_OP_MOV          = 0x36,
00087     WINED3D_SM4_OP_MOVC         = 0x37,
00088     WINED3D_SM4_OP_MUL          = 0x38,
00089     WINED3D_SM4_OP_RET          = 0x3e,
00090     WINED3D_SM4_OP_ROUND_NI     = 0x41,
00091     WINED3D_SM4_OP_RSQ          = 0x44,
00092     WINED3D_SM4_OP_SAMPLE       = 0x45,
00093     WINED3D_SM4_OP_SAMPLE_LOD   = 0x48,
00094     WINED3D_SM4_OP_SAMPLE_GRAD  = 0x49,
00095     WINED3D_SM4_OP_SQRT         = 0x4b,
00096     WINED3D_SM4_OP_SINCOS       = 0x4d,
00097     WINED3D_SM4_OP_UDIV         = 0x4e,
00098     WINED3D_SM4_OP_USHR         = 0x55,
00099     WINED3D_SM4_OP_UTOF         = 0x56,
00100     WINED3D_SM4_OP_XOR          = 0x57,
00101 };
00102 
00103 enum wined3d_sm4_register_type
00104 {
00105     WINED3D_SM4_RT_TEMP         = 0x0,
00106     WINED3D_SM4_RT_INPUT        = 0x1,
00107     WINED3D_SM4_RT_OUTPUT       = 0x2,
00108     WINED3D_SM4_RT_IMMCONST     = 0x4,
00109     WINED3D_SM4_RT_SAMPLER      = 0x6,
00110     WINED3D_SM4_RT_CONSTBUFFER  = 0x8,
00111     WINED3D_SM4_RT_NULL         = 0xd,
00112 };
00113 
00114 enum wined3d_sm4_immconst_type
00115 {
00116     WINED3D_SM4_IMMCONST_SCALAR = 0x1,
00117     WINED3D_SM4_IMMCONST_VEC4   = 0x2,
00118 };
00119 
00120 struct wined3d_sm4_data
00121 {
00122     struct wined3d_shader_version shader_version;
00123     const DWORD *end;
00124     const struct wined3d_shader_signature *output_signature;
00125 };
00126 
00127 struct wined3d_sm4_opcode_info
00128 {
00129     enum wined3d_sm4_opcode opcode;
00130     enum WINED3D_SHADER_INSTRUCTION_HANDLER handler_idx;
00131     UINT dst_count;
00132     UINT src_count;
00133 };
00134 
00135 struct sysval_map
00136 {
00137     enum wined3d_sysval_semantic sysval;
00138     enum wined3d_shader_register_type register_type;
00139     UINT register_idx;
00140 };
00141 
00142 static const struct wined3d_sm4_opcode_info opcode_table[] =
00143 {
00144     {WINED3D_SM4_OP_ADD,        WINED3DSIH_ADD,         1,  2},
00145     {WINED3D_SM4_OP_AND,        WINED3DSIH_AND,         1,  2},
00146     {WINED3D_SM4_OP_BREAK,      WINED3DSIH_BREAK,       0,  0},
00147     {WINED3D_SM4_OP_BREAKC,     WINED3DSIH_BREAKP,      0,  1},
00148     {WINED3D_SM4_OP_CUT,        WINED3DSIH_CUT,         0,  0},
00149     {WINED3D_SM4_OP_DERIV_RTX,  WINED3DSIH_DSX,         1,  1},
00150     {WINED3D_SM4_OP_DERIV_RTY,  WINED3DSIH_DSY,         1,  1},
00151     {WINED3D_SM4_OP_DIV,        WINED3DSIH_DIV,         1,  2},
00152     {WINED3D_SM4_OP_DP3,        WINED3DSIH_DP3,         1,  2},
00153     {WINED3D_SM4_OP_DP4,        WINED3DSIH_DP4,         1,  2},
00154     {WINED3D_SM4_OP_EMIT,       WINED3DSIH_EMIT,        0,  0},
00155     {WINED3D_SM4_OP_ENDIF,      WINED3DSIH_ENDIF,       0,  0},
00156     {WINED3D_SM4_OP_ENDLOOP,    WINED3DSIH_ENDLOOP,     0,  0},
00157     {WINED3D_SM4_OP_EQ,         WINED3DSIH_EQ,          1,  2},
00158     {WINED3D_SM4_OP_EXP,        WINED3DSIH_EXP,         1,  1},
00159     {WINED3D_SM4_OP_FRC,        WINED3DSIH_FRC,         1,  1},
00160     {WINED3D_SM4_OP_FTOI,       WINED3DSIH_FTOI,        1,  1},
00161     {WINED3D_SM4_OP_GE,         WINED3DSIH_GE,          1,  2},
00162     {WINED3D_SM4_OP_IADD,       WINED3DSIH_IADD,        1,  2},
00163     {WINED3D_SM4_OP_IF,         WINED3DSIH_IF,          0,  1},
00164     {WINED3D_SM4_OP_IEQ,        WINED3DSIH_IEQ,         1,  2},
00165     {WINED3D_SM4_OP_IGE,        WINED3DSIH_IGE,         1,  2},
00166     {WINED3D_SM4_OP_IMUL,       WINED3DSIH_IMUL,        2,  2},
00167     {WINED3D_SM4_OP_ITOF,       WINED3DSIH_ITOF,        1,  1},
00168     {WINED3D_SM4_OP_LD,         WINED3DSIH_LD,          1,  2},
00169     {WINED3D_SM4_OP_LOG,        WINED3DSIH_LOG,         1,  1},
00170     {WINED3D_SM4_OP_LOOP,       WINED3DSIH_LOOP,        0,  0},
00171     {WINED3D_SM4_OP_LT,         WINED3DSIH_LT,          1,  2},
00172     {WINED3D_SM4_OP_MAD,        WINED3DSIH_MAD,         1,  3},
00173     {WINED3D_SM4_OP_MIN,        WINED3DSIH_MIN,         1,  2},
00174     {WINED3D_SM4_OP_MAX,        WINED3DSIH_MAX,         1,  2},
00175     {WINED3D_SM4_OP_MOV,        WINED3DSIH_MOV,         1,  1},
00176     {WINED3D_SM4_OP_MOVC,       WINED3DSIH_MOVC,        1,  3},
00177     {WINED3D_SM4_OP_MUL,        WINED3DSIH_MUL,         1,  2},
00178     {WINED3D_SM4_OP_RET,        WINED3DSIH_RET,         0,  0},
00179     {WINED3D_SM4_OP_ROUND_NI,   WINED3DSIH_ROUND_NI,    1,  1},
00180     {WINED3D_SM4_OP_RSQ,        WINED3DSIH_RSQ,         1,  1},
00181     {WINED3D_SM4_OP_SAMPLE,     WINED3DSIH_SAMPLE,      1,  3},
00182     {WINED3D_SM4_OP_SAMPLE_LOD, WINED3DSIH_SAMPLE_LOD,  1,  4},
00183     {WINED3D_SM4_OP_SAMPLE_GRAD,WINED3DSIH_SAMPLE_GRAD, 1,  5},
00184     {WINED3D_SM4_OP_SQRT,       WINED3DSIH_SQRT,        1,  1},
00185     {WINED3D_SM4_OP_SINCOS,     WINED3DSIH_SINCOS,      2,  1},
00186     {WINED3D_SM4_OP_UDIV,       WINED3DSIH_UDIV,        2,  2},
00187     {WINED3D_SM4_OP_USHR,       WINED3DSIH_USHR,        1,  2},
00188     {WINED3D_SM4_OP_UTOF,       WINED3DSIH_UTOF,        1,  1},
00189     {WINED3D_SM4_OP_XOR,        WINED3DSIH_XOR,         1,  2},
00190 };
00191 
00192 static const enum wined3d_shader_register_type register_type_table[] =
00193 {
00194     /* WINED3D_SM4_RT_TEMP */           WINED3DSPR_TEMP,
00195     /* WINED3D_SM4_RT_INPUT */          WINED3DSPR_INPUT,
00196     /* WINED3D_SM4_RT_OUTPUT */         WINED3DSPR_OUTPUT,
00197     /* UNKNOWN */                       0,
00198     /* WINED3D_SM4_RT_IMMCONST */       WINED3DSPR_IMMCONST,
00199     /* UNKNOWN */                       0,
00200     /* WINED3D_SM4_RT_SAMPLER */        WINED3DSPR_SAMPLER,
00201     /* WINED3D_SM4_RT_RESOURCE */       WINED3DSPR_RESOURCE,
00202     /* WINED3D_SM4_RT_CONSTBUFFER */    WINED3DSPR_CONSTBUFFER,
00203     /* UNKNOWN */                       0,
00204     /* UNKNOWN */                       0,
00205     /* UNKNOWN */                       0,
00206     /* UNKNOWN */                       0,
00207     /* WINED3D_SM4_RT_NULL */           WINED3DSPR_NULL,
00208 };
00209 
00210 static const struct sysval_map sysval_map[] =
00211 {
00212     {WINED3D_SV_DEPTH,      WINED3DSPR_DEPTHOUT,    0},
00213     {WINED3D_SV_TARGET0,    WINED3DSPR_COLOROUT,    0},
00214     {WINED3D_SV_TARGET1,    WINED3DSPR_COLOROUT,    1},
00215     {WINED3D_SV_TARGET2,    WINED3DSPR_COLOROUT,    2},
00216     {WINED3D_SV_TARGET3,    WINED3DSPR_COLOROUT,    3},
00217     {WINED3D_SV_TARGET4,    WINED3DSPR_COLOROUT,    4},
00218     {WINED3D_SV_TARGET5,    WINED3DSPR_COLOROUT,    5},
00219     {WINED3D_SV_TARGET6,    WINED3DSPR_COLOROUT,    6},
00220     {WINED3D_SV_TARGET7,    WINED3DSPR_COLOROUT,    7},
00221 };
00222 
00223 static const struct wined3d_sm4_opcode_info *get_opcode_info(enum wined3d_sm4_opcode opcode)
00224 {
00225     unsigned int i;
00226 
00227     for (i = 0; i < sizeof(opcode_table) / sizeof(*opcode_table); ++i)
00228     {
00229         if (opcode == opcode_table[i].opcode) return &opcode_table[i];
00230     }
00231 
00232     return NULL;
00233 }
00234 
00235 static void map_sysval(enum wined3d_sysval_semantic sysval, struct wined3d_shader_register *reg)
00236 {
00237     unsigned int i;
00238 
00239     for (i = 0; i < sizeof(sysval_map) / sizeof(*sysval_map); ++i)
00240     {
00241         if (sysval == sysval_map[i].sysval)
00242         {
00243             reg->type = sysval_map[i].register_type;
00244             reg->idx = sysval_map[i].register_idx;
00245         }
00246     }
00247 }
00248 
00249 static void map_register(const struct wined3d_sm4_data *priv, struct wined3d_shader_register *reg)
00250 {
00251     switch (priv->shader_version.type)
00252     {
00253         case WINED3D_SHADER_TYPE_PIXEL:
00254             if (reg->type == WINED3DSPR_OUTPUT)
00255             {
00256                 unsigned int i;
00257                 const struct wined3d_shader_signature *s = priv->output_signature;
00258 
00259                 if (!s)
00260                 {
00261                     ERR("Shader has no output signature, unable to map register.\n");
00262                     break;
00263                 }
00264 
00265                 for (i = 0; i < s->element_count; ++i)
00266                 {
00267                     if (s->elements[i].register_idx == reg->idx)
00268                     {
00269                         map_sysval(s->elements[i].sysval_semantic, reg);
00270                         break;
00271                     }
00272                 }
00273             }
00274             break;
00275 
00276         default:
00277             break;
00278     }
00279 }
00280 
00281 static void *shader_sm4_init(const DWORD *byte_code, const struct wined3d_shader_signature *output_signature)
00282 {
00283     struct wined3d_sm4_data *priv = HeapAlloc(GetProcessHeap(), 0, sizeof(*priv));
00284     if (!priv)
00285     {
00286         ERR("Failed to allocate private data\n");
00287         return NULL;
00288     }
00289 
00290     priv->output_signature = output_signature;
00291 
00292     return priv;
00293 }
00294 
00295 static void shader_sm4_free(void *data)
00296 {
00297     HeapFree(GetProcessHeap(), 0, data);
00298 }
00299 
00300 static void shader_sm4_read_header(void *data, const DWORD **ptr, struct wined3d_shader_version *shader_version)
00301 {
00302     struct wined3d_sm4_data *priv = data;
00303     DWORD version_token;
00304 
00305     priv->end = *ptr;
00306 
00307     version_token = *(*ptr)++;
00308     TRACE("version: 0x%08x\n", version_token);
00309 
00310     TRACE("token count: %u\n", **ptr);
00311     priv->end += *(*ptr)++;
00312 
00313     switch (version_token >> 16)
00314     {
00315         case WINED3D_SM4_PS:
00316             priv->shader_version.type = WINED3D_SHADER_TYPE_PIXEL;
00317             break;
00318 
00319         case WINED3D_SM4_VS:
00320             priv->shader_version.type = WINED3D_SHADER_TYPE_VERTEX;
00321             break;
00322 
00323         case WINED3D_SM4_GS:
00324             priv->shader_version.type = WINED3D_SHADER_TYPE_GEOMETRY;
00325             break;
00326 
00327         default:
00328             FIXME("Unrecognized shader type %#x\n", version_token >> 16);
00329     }
00330     priv->shader_version.major = WINED3D_SM4_VERSION_MAJOR(version_token);
00331     priv->shader_version.minor = WINED3D_SM4_VERSION_MINOR(version_token);
00332 
00333     *shader_version = priv->shader_version;
00334 }
00335 
00336 static void shader_sm4_read_opcode(void *data, const DWORD **ptr, struct wined3d_shader_instruction *ins,
00337         UINT *param_size)
00338 {
00339     const struct wined3d_sm4_opcode_info *opcode_info;
00340     DWORD token = *(*ptr)++;
00341     DWORD opcode = token & WINED3D_SM4_OPCODE_MASK;
00342 
00343     *param_size = ((token & WINED3D_SM4_INSTRUCTION_LENGTH_MASK) >> WINED3D_SM4_INSTRUCTION_LENGTH_SHIFT) - 1;
00344 
00345     opcode_info = get_opcode_info(opcode);
00346     if (!opcode_info)
00347     {
00348         FIXME("Unrecognized opcode %#x, token 0x%08x\n", opcode, token);
00349         ins->handler_idx = WINED3DSIH_TABLE_SIZE;
00350         return;
00351     }
00352 
00353     ins->handler_idx = opcode_info->handler_idx;
00354     ins->flags = 0;
00355     ins->coissue = 0;
00356     ins->predicate = 0;
00357     ins->dst_count = opcode_info->dst_count;
00358     ins->src_count = opcode_info->src_count;
00359 
00360     if (token & WINED3D_SM4_INSTRUCTION_MODIFIER)
00361     {
00362         DWORD modifier = *(*ptr)++;
00363         FIXME("Skipping modifier 0x%08x.\n", modifier);
00364     }
00365 }
00366 
00367 static void shader_sm4_read_src_param(void *data, const DWORD **ptr, struct wined3d_shader_src_param *src_param,
00368         struct wined3d_shader_src_param *src_rel_addr)
00369 {
00370     struct wined3d_sm4_data *priv = data;
00371     DWORD token = *(*ptr)++;
00372     enum wined3d_sm4_register_type register_type;
00373     DWORD order;
00374 
00375     register_type = (token & WINED3D_SM4_REGISTER_TYPE_MASK) >> WINED3D_SM4_REGISTER_TYPE_SHIFT;
00376     if (register_type >= sizeof(register_type_table) / sizeof(*register_type_table))
00377     {
00378         FIXME("Unhandled register type %#x\n", register_type);
00379         src_param->reg.type = WINED3DSPR_TEMP;
00380     }
00381     else
00382     {
00383         src_param->reg.type = register_type_table[register_type];
00384     }
00385 
00386     if (token & WINED3D_SM4_REGISTER_MODIFIER)
00387     {
00388         DWORD modifier = *(*ptr)++;
00389 
00390         /* FIXME: This will probably break down at some point. The SM4
00391          * modifiers look like flags, while wined3d currently has an enum
00392          * with possible combinations, e.g. WINED3DSPSM_ABSNEG. */
00393         switch (modifier)
00394         {
00395             case 0x41:
00396                 src_param->modifiers = WINED3DSPSM_NEG;
00397                 break;
00398 
00399             case 0x81:
00400                 src_param->modifiers = WINED3DSPSM_ABS;
00401                 break;
00402 
00403             default:
00404                 FIXME("Skipping modifier 0x%08x.\n", modifier);
00405                 src_param->modifiers = WINED3DSPSM_NONE;
00406                 break;
00407         }
00408     }
00409     else
00410     {
00411         src_param->modifiers = WINED3DSPSM_NONE;
00412     }
00413 
00414     order = (token & WINED3D_SM4_REGISTER_ORDER_MASK) >> WINED3D_SM4_REGISTER_ORDER_SHIFT;
00415 
00416     if (order < 1) src_param->reg.idx = ~0U;
00417     else src_param->reg.idx = *(*ptr)++;
00418 
00419     if (order < 2) src_param->reg.array_idx = ~0U;
00420     else src_param->reg.array_idx = *(*ptr)++;
00421 
00422     if (order > 2) FIXME("Unhandled order %u.\n", order);
00423 
00424     if (register_type == WINED3D_SM4_RT_IMMCONST)
00425     {
00426         enum wined3d_sm4_immconst_type immconst_type =
00427                 (token & WINED3D_SM4_IMMCONST_TYPE_MASK) >> WINED3D_SM4_IMMCONST_TYPE_SHIFT;
00428         src_param->swizzle = WINED3DSP_NOSWIZZLE;
00429 
00430         switch(immconst_type)
00431         {
00432             case WINED3D_SM4_IMMCONST_SCALAR:
00433                 src_param->reg.immconst_type = WINED3D_IMMCONST_SCALAR;
00434                 memcpy(src_param->reg.immconst_data, *ptr, 1 * sizeof(DWORD));
00435                 *ptr += 1;
00436                 break;
00437 
00438             case WINED3D_SM4_IMMCONST_VEC4:
00439                 src_param->reg.immconst_type = WINED3D_IMMCONST_VEC4;
00440                 memcpy(src_param->reg.immconst_data, *ptr, 4 * sizeof(DWORD));
00441                 *ptr += 4;
00442                 break;
00443 
00444             default:
00445                 FIXME("Unhandled immediate constant type %#x\n", immconst_type);
00446                 break;
00447         }
00448     }
00449     else
00450     {
00451         src_param->swizzle = (token & WINED3D_SM4_SWIZZLE_MASK) >> WINED3D_SM4_SWIZZLE_SHIFT;
00452     }
00453 
00454     src_param->reg.rel_addr = NULL;
00455 
00456     map_register(priv, &src_param->reg);
00457 }
00458 
00459 static void shader_sm4_read_dst_param(void *data, const DWORD **ptr, struct wined3d_shader_dst_param *dst_param,
00460         struct wined3d_shader_src_param *dst_rel_addr)
00461 {
00462     struct wined3d_sm4_data *priv = data;
00463     DWORD token = *(*ptr)++;
00464     enum wined3d_sm4_register_type register_type;
00465     DWORD order;
00466 
00467     register_type = (token & WINED3D_SM4_REGISTER_TYPE_MASK) >> WINED3D_SM4_REGISTER_TYPE_SHIFT;
00468     if (register_type >= sizeof(register_type_table) / sizeof(*register_type_table))
00469     {
00470         FIXME("Unhandled register type %#x\n", register_type);
00471         dst_param->reg.type = WINED3DSPR_TEMP;
00472     }
00473     else
00474     {
00475         dst_param->reg.type = register_type_table[register_type];
00476     }
00477 
00478     order = (token & WINED3D_SM4_REGISTER_ORDER_MASK) >> WINED3D_SM4_REGISTER_ORDER_SHIFT;
00479 
00480     if (order < 1) dst_param->reg.idx = ~0U;
00481     else dst_param->reg.idx = *(*ptr)++;
00482 
00483     if (order < 2) dst_param->reg.array_idx = ~0U;
00484     else dst_param->reg.array_idx = *(*ptr)++;
00485 
00486     if (order > 2) FIXME("Unhandled order %u.\n", order);
00487 
00488     dst_param->write_mask = (token & WINED3D_SM4_WRITEMASK_MASK) >> WINED3D_SM4_WRITEMASK_SHIFT;
00489     dst_param->modifiers = 0;
00490     dst_param->shift = 0;
00491     dst_param->reg.rel_addr = NULL;
00492 
00493     map_register(priv, &dst_param->reg);
00494 }
00495 
00496 static void shader_sm4_read_semantic(const DWORD **ptr, struct wined3d_shader_semantic *semantic)
00497 {
00498     FIXME("ptr %p, semantic %p stub!\n", ptr, semantic);
00499 }
00500 
00501 static void shader_sm4_read_comment(const DWORD **ptr, const char **comment, UINT *comment_size)
00502 {
00503     FIXME("ptr %p, comment %p, comment_size %p stub!\n", ptr, comment, comment_size);
00504     *comment = NULL;
00505 }
00506 
00507 static BOOL shader_sm4_is_end(void *data, const DWORD **ptr)
00508 {
00509     struct wined3d_sm4_data *priv = data;
00510     return *ptr == priv->end;
00511 }
00512 
00513 const struct wined3d_shader_frontend sm4_shader_frontend =
00514 {
00515     shader_sm4_init,
00516     shader_sm4_free,
00517     shader_sm4_read_header,
00518     shader_sm4_read_opcode,
00519     shader_sm4_read_src_param,
00520     shader_sm4_read_dst_param,
00521     shader_sm4_read_semantic,
00522     shader_sm4_read_comment,
00523     shader_sm4_is_end,
00524 };

Generated on Mon May 28 2012 04:21:53 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.