Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenshader_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
1.7.6.1
|