Changeset 21731 in vbox for trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/baseshader.c
- Timestamp:
- Jul 21, 2009 9:16:52 AM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 50306
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/baseshader.c
r20612 r21731 148 148 } 149 149 150 static inline BOOL shader_is_version_token(DWORD token) { 151 return shader_is_pshader_version(token) || 152 shader_is_vshader_version(token); 153 } 154 155 void shader_buffer_init(struct SHADER_BUFFER *buffer) 156 { 157 buffer->buffer = HeapAlloc(GetProcessHeap(), 0, SHADER_PGMSIZE); 150 void shader_buffer_clear(struct wined3d_shader_buffer *buffer) 151 { 158 152 buffer->buffer[0] = '\0'; 159 153 buffer->bsize = 0; … … 162 156 } 163 157 164 void shader_buffer_free(struct SHADER_BUFFER *buffer) 158 BOOL shader_buffer_init(struct wined3d_shader_buffer *buffer) 159 { 160 buffer->buffer = HeapAlloc(GetProcessHeap(), 0, SHADER_PGMSIZE); 161 if (!buffer->buffer) 162 { 163 ERR("Failed to allocate shader buffer memory.\n"); 164 return FALSE; 165 } 166 167 shader_buffer_clear(buffer); 168 return TRUE; 169 } 170 171 void shader_buffer_free(struct wined3d_shader_buffer *buffer) 165 172 { 166 173 HeapFree(GetProcessHeap(), 0, buffer->buffer); 167 174 } 168 175 169 int shader_vaddline( SHADER_BUFFER*buffer, const char *format, va_list args)176 int shader_vaddline(struct wined3d_shader_buffer *buffer, const char *format, va_list args) 170 177 { 171 178 char* base = buffer->buffer + buffer->bsize; … … 174 181 rc = _vsnprintf(base, SHADER_PGMSIZE - 1 - buffer->bsize, format, args); 175 182 176 if (rc < 0 || /* C89 */ 177 rc > SHADER_PGMSIZE - 1 - buffer->bsize) { /* C99 */ 178 183 if (rc < 0 /* C89 */ || (unsigned int)rc > SHADER_PGMSIZE - 1 - buffer->bsize /* C99 */) 184 { 179 185 ERR("The buffer allocated for the shader program string " 180 186 "is too small at %d bytes.\n", SHADER_PGMSIZE); … … 198 204 } 199 205 200 int shader_addline( SHADER_BUFFER*buffer, const char *format, ...)206 int shader_addline(struct wined3d_shader_buffer *buffer, const char *format, ...) 201 207 { 202 208 int ret; … … 256 262 257 263 static void shader_record_register_usage(IWineD3DBaseShaderImpl *This, struct shader_reg_maps *reg_maps, 258 const struct wined3d_shader_register *reg, BOOL pshader)264 const struct wined3d_shader_register *reg, enum wined3d_shader_type shader_type) 259 265 { 260 266 switch (reg->type) 261 267 { 262 268 case WINED3DSPR_TEXTURE: /* WINED3DSPR_ADDR */ 263 if ( pshader) reg_maps->texcoord[reg->idx] = 1;269 if (shader_type == WINED3D_SHADER_TYPE_PIXEL) reg_maps->texcoord[reg->idx] = 1; 264 270 else reg_maps->address[reg->idx] = 1; 265 271 break; … … 270 276 271 277 case WINED3DSPR_INPUT: 272 if (!pshader) reg_maps->input_registers |= 1 << reg->idx; 273 else 278 if (shader_type == WINED3D_SHADER_TYPE_PIXEL) 274 279 { 275 280 if (reg->rel_addr) … … 289 294 } 290 295 } 296 else reg_maps->input_registers |= 1 << reg->idx; 291 297 break; 292 298 … … 296 302 297 303 case WINED3DSPR_MISCTYPE: 298 if (pshader && reg->idx == 0) reg_maps->vpos = 1; 304 if (shader_type == WINED3D_SHADER_TYPE_PIXEL) 305 { 306 if (reg->idx == 0) reg_maps->vpos = 1; 307 else if (reg->idx == 1) reg_maps->usesfacing = 1; 308 } 299 309 break; 300 310 … … 302 312 if (reg->rel_addr) 303 313 { 304 if ( !pshader)314 if (shader_type != WINED3D_SHADER_TYPE_PIXEL) 305 315 { 306 if (reg->idx <= ((IWineD3DVertexShaderImpl *)This)->min_rel_offset) 316 if (reg->idx < ((IWineD3DVertexShaderImpl *)This)->min_rel_offset) 317 { 307 318 ((IWineD3DVertexShaderImpl *)This)->min_rel_offset = reg->idx; 308 else if (reg->idx >= ((IWineD3DVertexShaderImpl *)This)->max_rel_offset) 319 } 320 if (reg->idx > ((IWineD3DVertexShaderImpl *)This)->max_rel_offset) 321 { 309 322 ((IWineD3DVertexShaderImpl *)This)->max_rel_offset = reg->idx; 323 } 310 324 } 311 325 reg_maps->usesrelconstF = TRUE; … … 323 337 case WINED3DSPR_CONSTBOOL: 324 338 reg_maps->boolean_constants |= (1 << reg->idx); 339 break; 340 341 case WINED3DSPR_COLOROUT: 342 reg_maps->highest_render_target = max(reg_maps->highest_render_target, reg->idx); 325 343 break; 326 344 … … 409 427 unsigned int cur_loop_depth = 0, max_loop_depth = 0; 410 428 const DWORD* pToken = byte_code; 411 char pshader;412 429 413 430 /* There are some minor differences between pixel and vertex shaders */ … … 424 441 fe->shader_read_header(fe_data, &pToken, &shader_version); 425 442 reg_maps->shader_version = shader_version; 426 pshader = shader_is_pshader_version(shader_version.type);427 443 428 444 reg_maps->constf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, … … 510 526 511 527 /* In pixel shader 1.X shaders, the constants are clamped between [-1;1] */ 512 if (shader_version.major == 1 && pshader)528 if (shader_version.major == 1 && shader_version.type == WINED3D_SHADER_TYPE_PIXEL) 513 529 { 514 530 float *value = (float *) lconst->value; 515 if (value[0] < -1.0) value[0] = -1.0;516 else if (value[0] > 1.0) value[0] = 1.0;517 if (value[1] < -1.0) value[1] = -1.0;518 else if (value[1] > 1.0) value[1] = 1.0;519 if (value[2] < -1.0) value[2] = -1.0;520 else if (value[2] > 1.0) value[2] = 1.0;521 if (value[3] < -1.0) value[3] = -1.0;522 else if (value[3] > 1.0) value[3] = 1.0;531 if (value[0] < -1.0f) value[0] = -1.0f; 532 else if (value[0] > 1.0f) value[0] = 1.0f; 533 if (value[1] < -1.0f) value[1] = -1.0f; 534 else if (value[1] > 1.0f) value[1] = 1.0f; 535 if (value[2] < -1.0f) value[2] = -1.0f; 536 else if (value[2] > 1.0f) value[2] = 1.0f; 537 if (value[3] < -1.0f) value[3] = -1.0f; 538 else if (value[3] > 1.0f) value[3] = 1.0f; 523 539 } 524 540 … … 540 556 541 557 list_add_head(&This->baseShader.constantsI, &lconst->entry); 558 reg_maps->local_int_consts |= (1 << dst.reg.idx); 542 559 } 543 560 else if (ins.handler_idx == WINED3DSIH_DEFB) … … 614 631 fe->shader_read_dst_param(fe_data, &pToken, &dst_param, &dst_rel_addr); 615 632 633 shader_record_register_usage(This, reg_maps, &dst_param.reg, shader_version.type); 634 616 635 /* WINED3DSPR_TEXCRDOUT is the same as WINED3DSPR_OUTPUT. _OUTPUT can be > MAX_REG_TEXCRD and 617 636 * is used in >= 3.0 shaders. Filter 3.0 shaders to prevent overflows, and also filter pixel 618 637 * shaders because TECRDOUT isn't used in them, but future register types might cause issues */ 619 if (!pshader && shader_version.major < 3 && dst_param.reg.type == WINED3DSPR_TEXCRDOUT) 638 if (shader_version.type == WINED3D_SHADER_TYPE_VERTEX && shader_version.major < 3 639 && dst_param.reg.type == WINED3DSPR_TEXCRDOUT) 620 640 { 621 reg_maps->texcoord_mask[dst_param.reg. type] |= dst_param.write_mask;641 reg_maps->texcoord_mask[dst_param.reg.idx] |= dst_param.write_mask; 622 642 } 623 else 643 644 if (shader_version.type == WINED3D_SHADER_TYPE_PIXEL) 624 645 { 625 if(pshader && dst_param.reg.type == WINED3DSPR_COLOROUT && dst_param.reg.idx == 0) 646 IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *)This; 647 648 if(dst_param.reg.type == WINED3DSPR_COLOROUT && dst_param.reg.idx == 0) 626 649 { 627 IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *) This; 650 /* Many 2.0 and 3.0 pixel shaders end with a MOV from a temp register to 651 * COLOROUT 0. If we know this in advance, the ARB shader backend can skip 652 * the mov and perform the sRGB write correction from the source register. 653 * 654 * However, if the mov is only partial, we can't do this, and if the write 655 * comes from an instruction other than MOV it is hard to do as well. If 656 * COLOROUT 0 is overwritten partially later, the marker is dropped again. */ 657 658 ps->color0_mov = FALSE; 659 if (ins.handler_idx == WINED3DSIH_MOV) 660 { 661 /* Used later when the source register is read. */ 662 color0_mov = TRUE; 663 } 664 } 665 /* Also drop the MOV marker if the source register is overwritten prior to the shader 666 * end 667 */ 668 else if(dst_param.reg.type == WINED3DSPR_TEMP && dst_param.reg.idx == ps->color0_reg) 669 { 628 670 ps->color0_mov = FALSE; 629 671 } 630 shader_record_register_usage(This, reg_maps, &dst_param.reg, pshader);631 672 } 632 673 633 674 /* Declare 1.X samplers implicitly, based on the destination reg. number */ 634 675 if (shader_version.major == 1 635 && pshader /* Filter different instructions with the same enum values in VS */636 676 && (ins.handler_idx == WINED3DSIH_TEX 637 677 || ins.handler_idx == WINED3DSIH_TEXBEM … … 663 703 } 664 704 } 665 else if ( pshader &&ins.handler_idx == WINED3DSIH_BEM)705 else if (ins.handler_idx == WINED3DSIH_BEM) 666 706 { 667 707 reg_maps->bumpmat[dst_param.reg.idx] = TRUE; 668 708 } 669 else if(pshader && ins.handler_idx == WINED3DSIH_MOV)670 {671 /* Many 2.0 and 3.0 pixel shaders end with a MOV from a temp register to672 * COLOROUT 0. If we know this in advance, the ARB shader backend can skip673 * the mov and perform the sRGB write correction from the source register.674 *675 * However, if the mov is only partial, we can't do this, and if the write676 * comes from an instruction other than MOV it is hard to do as well. If677 * COLOROUT 0 is overwritten partially later, the marker is dropped again678 */679 if(dst_param.reg.type == WINED3DSPR_COLOROUT && dst_param.reg.idx == 0)680 {681 /* Used later when the source register is read */682 color0_mov = TRUE;683 }684 }685 709 } 686 710 … … 701 725 reg_maps->usestexldd = 1; 702 726 } 727 else if(ins.handler_idx == WINED3DSIH_TEXLDL) 728 { 729 reg_maps->usestexldl = 1; 730 } 703 731 else if(ins.handler_idx == WINED3DSIH_MOVA) 704 732 { 705 733 reg_maps->usesmova = 1; 734 } 735 else if(ins.handler_idx == WINED3DSIH_IFC) 736 { 737 reg_maps->usesifc = 1; 738 } 739 else if(ins.handler_idx == WINED3DSIH_CALL) 740 { 741 reg_maps->usescall = 1; 706 742 } 707 743 … … 715 751 count = get_instr_extra_regcount(ins.handler_idx, i); 716 752 717 shader_record_register_usage(This, reg_maps, &src_param.reg, pshader);753 shader_record_register_usage(This, reg_maps, &src_param.reg, shader_version.type); 718 754 while (count) 719 755 { 720 756 ++src_param.reg.idx; 721 shader_record_register_usage(This, reg_maps, &src_param.reg, pshader);757 shader_record_register_usage(This, reg_maps, &src_param.reg, shader_version.type); 722 758 --count; 723 759 } … … 738 774 reg_maps->loop_depth = max_loop_depth; 739 775 740 This->baseShader.functionLength = ((c har *)pToken - (char *)byte_code);776 This->baseShader.functionLength = ((const char *)pToken - (const char *)byte_code); 741 777 742 778 return WINED3D_OK; … … 761 797 { 762 798 /* Pixel shaders 3.0 don't have usage semantics */ 763 if (shader_ is_pshader_version(shader_version->type) && shader_version->major < 3)799 if (shader_version->major < 3 && shader_version->type == WINED3D_SHADER_TYPE_PIXEL) 764 800 return; 765 801 else … … 843 879 844 880 case WINED3DSPR_TEXTURE: /* vs: case WINED3DSPR_ADDR */ 845 TRACE("%c", shader_ is_pshader_version(shader_version->type)? 't' : 'a');881 TRACE("%c", shader_version->type == WINED3D_SHADER_TYPE_PIXEL ? 't' : 'a'); 846 882 break; 847 883 … … 902 938 break; 903 939 940 case WINED3DSPR_CONSTBUFFER: 941 TRACE("cb"); 942 break; 943 904 944 default: 905 945 TRACE("unhandled_rtype(%#x)", reg->type); … … 913 953 { 914 954 case WINED3D_IMMCONST_FLOAT: 915 TRACE("%.8e", *( float *)reg->immconst_data);955 TRACE("%.8e", *(const float *)reg->immconst_data); 916 956 break; 917 957 918 958 case WINED3D_IMMCONST_FLOAT4: 919 959 TRACE("%.8e, %.8e, %.8e, %.8e", 920 *( float *)®->immconst_data[0], *(float *)®->immconst_data[1],921 *( float *)®->immconst_data[2], *(float *)®->immconst_data[3]);960 *(const float *)®->immconst_data[0], *(const float *)®->immconst_data[1], 961 *(const float *)®->immconst_data[2], *(const float *)®->immconst_data[3]); 922 962 break; 923 963 … … 930 970 else if (reg->type != WINED3DSPR_RASTOUT && reg->type != WINED3DSPR_MISCTYPE) 931 971 { 932 if (reg->rel_addr) 933 { 934 TRACE("["); 935 shader_dump_src_param(reg->rel_addr, shader_version); 936 TRACE(" + "); 937 } 938 TRACE("%u", offset); 939 if (reg->rel_addr) TRACE("]"); 972 if (reg->array_idx != ~0U) 973 { 974 TRACE("%u[%u", offset, reg->array_idx); 975 if (reg->rel_addr) 976 { 977 TRACE(" + "); 978 shader_dump_src_param(reg->rel_addr, shader_version); 979 } 980 TRACE("]"); 981 } 982 else 983 { 984 if (reg->rel_addr) 985 { 986 TRACE("["); 987 shader_dump_src_param(reg->rel_addr, shader_version); 988 TRACE(" + "); 989 } 990 TRACE("%u", offset); 991 if (reg->rel_addr) TRACE("]"); 992 } 940 993 } 941 994 } … … 1029 1082 /* Shared code in order to generate the bulk of the shader string. 1030 1083 * NOTE: A description of how to parse tokens can be found on msdn */ 1031 void shader_generate_main(IWineD3DBaseShader *iface, SHADER_BUFFER*buffer,1084 void shader_generate_main(IWineD3DBaseShader *iface, struct wined3d_shader_buffer *buffer, 1032 1085 const shader_reg_maps *reg_maps, const DWORD *pFunction, void *backend_ctx) 1033 1086 { … … 1085 1138 || ins.handler_idx == WINED3DSIH_DEFI 1086 1139 || ins.handler_idx == WINED3DSIH_DEFB 1087 || ins.handler_idx == WINED3DSIH_PHASE 1088 || ins.handler_idx == WINED3DSIH_RET) 1140 || ins.handler_idx == WINED3DSIH_PHASE) 1089 1141 { 1090 1142 pToken += param_size; … … 1138 1190 struct wined3d_shader_version shader_version; 1139 1191 const DWORD* pToken = pFunction; 1192 const char *type_prefix; 1140 1193 DWORD i; 1141 1194 … … 1144 1197 fe->shader_read_header(fe_data, &pToken, &shader_version); 1145 1198 1146 TRACE("%s_%u_%u\n", shader_is_pshader_version(shader_version.type) ? "ps": "vs", 1147 shader_version.major, shader_version.minor); 1199 switch (shader_version.type) 1200 { 1201 case WINED3D_SHADER_TYPE_VERTEX: 1202 type_prefix = "vs"; 1203 break; 1204 1205 case WINED3D_SHADER_TYPE_GEOMETRY: 1206 type_prefix = "gs"; 1207 break; 1208 1209 case WINED3D_SHADER_TYPE_PIXEL: 1210 type_prefix = "ps"; 1211 break; 1212 1213 default: 1214 FIXME("Unhandled shader type %#x.\n", shader_version.type); 1215 type_prefix = "unknown"; 1216 break; 1217 } 1218 1219 TRACE("%s_%u_%u\n", type_prefix, shader_version.major, shader_version.minor); 1148 1220 1149 1221 while (!fe->shader_is_end(fe_data, &pToken)) … … 1317 1389 1318 1390 #define GLINFO_LOCATION (*gl_info) 1319 static void shader_none_get_caps(WINED3DDEVTYPE devtype, const WineD3D_GL_Info *gl_info, struct shader_caps *pCaps) 1391 static void shader_none_get_caps(WINED3DDEVTYPE devtype, 1392 const struct wined3d_gl_info *gl_info, struct shader_caps *pCaps) 1320 1393 { 1321 1394 /* Set the shader caps to 0 for the none shader backend */ 1322 1395 pCaps->VertexShaderVersion = 0; 1323 1396 pCaps->PixelShaderVersion = 0; 1324 pCaps->PixelShader1xMaxValue = 0.0 ;1397 pCaps->PixelShader1xMaxValue = 0.0f; 1325 1398 } 1326 1399 #undef GLINFO_LOCATION
Note:
See TracChangeset
for help on using the changeset viewer.