Changeset 23571 in vbox for trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/arb_program_shader.c
- Timestamp:
- Oct 6, 2009 6:07:06 AM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 53228
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/Graphics/Wine/wined3d/arb_program_shader.c
r22496 r23571 101 101 /* ARB_program_shader private data */ 102 102 103 struct loop_control104 {105 unsigned int count;106 unsigned int start;107 int step;108 };109 110 103 struct control_frame 111 104 { … … 125 118 unsigned int ifc_no; 126 119 }; 127 struct loop_controlloop_control;120 struct wined3d_shader_loop_control loop_control; 128 121 BOOL had_else; 129 122 }; … … 142 135 { 143 136 struct ps_compile_args super; 144 DWORD bools; /* WORD is enough, use DWORD for alignment */ 137 WORD bools; 138 WORD clip; /* only a boolean, use a WORD for alignment */ 145 139 unsigned char loop_ctrl[MAX_CONST_I][3]; 146 140 }; … … 282 276 ********************************************************/ 283 277 284 /** 285 * Loads floating point constants into the currently set ARB_vertex/fragment_program. 278 /* Loads floating point constants into the currently set ARB_vertex/fragment_program. 286 279 * When constant_list == NULL, it will load all the constants. 287 * 280 * 288 281 * @target_type should be either GL_VERTEX_PROGRAM_ARB (for vertex shaders) 289 282 * or GL_FRAGMENT_PROGRAM_ARB (for pixel shaders) … … 294 287 { 295 288 local_constant* lconst; 296 DWORD i = 0, j;289 DWORD i, j; 297 290 unsigned int ret; 298 291 299 if (TRACE_ON(d3d_shader)) { 292 if (TRACE_ON(d3d_constants)) 293 { 300 294 for(i = 0; i < max_constants; i++) { 301 295 if(!dirty_consts[i]) continue; … … 305 299 } 306 300 } 301 302 i = 0; 303 307 304 /* In 1.X pixel shaders constants are implicitly clamped in the range [-1;1] */ 308 305 if (target_type == GL_FRAGMENT_PROGRAM_ARB && This->baseShader.reg_maps.shader_version.major == 1) … … 546 543 /** 547 544 * Loads the app-supplied constants into the currently set ARB_[vertex/fragment]_programs. 548 * 549 * We only support float constants in ARB at the moment, so don't 545 * 546 * We only support float constants in ARB at the moment, so don't 550 547 * worry about the Integers or Booleans 551 548 */ … … 632 629 unsigned max_constantsF; 633 630 const local_constant *lconst; 631 DWORD map; 634 632 635 633 /* In pixel shaders, all private constants are program local, we don't need anything … … 675 673 } 676 674 677 for(i = 0; i < This->baseShader.limits.temporary; i++) { 678 if (reg_maps->temporary[i]) 679 shader_addline(buffer, "TEMP R%u;\n", i); 680 } 681 682 for (i = 0; i < This->baseShader.limits.address; i++) { 683 if (reg_maps->address[i]) 684 shader_addline(buffer, "ADDRESS A%d;\n", i); 685 } 686 687 if(pshader && reg_maps->shader_version.major == 1 && reg_maps->shader_version.minor <= 3) { 688 for(i = 0; i < This->baseShader.limits.texcoord; i++) { 689 if (reg_maps->texcoord[i] && pshader) 690 shader_addline(buffer,"TEMP T%u;\n", i); 675 for (i = 0, map = reg_maps->temporary; map; map >>= 1, ++i) 676 { 677 if (map & 1) shader_addline(buffer, "TEMP R%u;\n", i); 678 } 679 680 for (i = 0, map = reg_maps->address; map; map >>= 1, ++i) 681 { 682 if (map & 1) shader_addline(buffer, "ADDRESS A%u;\n", i); 683 } 684 685 if (pshader && reg_maps->shader_version.major == 1 && reg_maps->shader_version.minor <= 3) 686 { 687 for (i = 0, map = reg_maps->texcoord; map; map >>= 1, ++i) 688 { 689 if (map & 1) shader_addline(buffer, "TEMP T%u;\n", i); 691 690 } 692 691 } … … 1262 1261 if (flags & TEX_DERIV) 1263 1262 { 1264 if(flags & TEX_PROJ) FIXME("Projected texture sampling with custom derivat es\n");1265 if(flags & TEX_BIAS) FIXME("Biased texture sampling with custom derivat es\n");1263 if(flags & TEX_PROJ) FIXME("Projected texture sampling with custom derivatives\n"); 1264 if(flags & TEX_BIAS) FIXME("Biased texture sampling with custom derivatives\n"); 1266 1265 shader_addline(buffer, "TXD%s %s, %s, %s, %s, texture[%u], %s;\n", mod, dst_str, coord_reg, 1267 1266 dsx, dsy,sampler_idx, tex_type); … … 2038 2037 char dst_str[50]; 2039 2038 char src0_name[50]; 2040 char dst_reg[ 8];2039 char dst_reg[50]; 2041 2040 BOOL is_color; 2042 2041 … … 2081 2080 char src0_name[50]; 2082 2081 char src1_name[50]; 2083 char dst_reg[ 8];2082 char dst_reg[50]; 2084 2083 BOOL is_color; 2085 2084 … … 3010 3009 { 3011 3010 GLuint program_id = 0; 3011 GLint pos; 3012 3012 3013 const char *blt_vprogram = 3013 3014 "!!ARBvp1.0\n" … … 3020 3021 GL_EXTCALL(glGenProgramsARB(1, &program_id)); 3021 3022 GL_EXTCALL(glBindProgramARB(GL_VERTEX_PROGRAM_ARB, program_id)); 3022 GL_EXTCALL(glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(blt_vprogram), blt_vprogram)); 3023 3024 if (glGetError() == GL_INVALID_OPERATION) { 3025 GLint pos; 3026 glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos); 3023 GL_EXTCALL(glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, 3024 strlen(blt_vprogram), blt_vprogram)); 3025 checkGLcall("glProgramStringARB()"); 3026 3027 glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos); 3028 if (pos != -1) 3029 { 3027 3030 FIXME("Vertex program error at position %d: %s\n", pos, 3028 3031 debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); 3029 3032 } 3033 else 3034 { 3035 GLint native; 3036 3037 GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB, &native)); 3038 checkGLcall("glGetProgramivARB()"); 3039 if (!native) WARN("Program exceeds native resource limits.\n"); 3040 } 3030 3041 3031 3042 return program_id; … … 3036 3047 { 3037 3048 GLuint program_id = 0; 3049 GLint pos; 3050 3038 3051 static const char * const blt_fprograms[tex_type_count] = 3039 3052 { … … 3070 3083 GL_EXTCALL(glGenProgramsARB(1, &program_id)); 3071 3084 GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, program_id)); 3072 GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(blt_fprograms[tex_type]), blt_fprograms[tex_type])); 3073 3074 if (glGetError() == GL_INVALID_OPERATION) { 3075 GLint pos; 3076 glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos); 3085 GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, 3086 strlen(blt_fprograms[tex_type]), blt_fprograms[tex_type])); 3087 checkGLcall("glProgramStringARB()"); 3088 3089 glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos); 3090 if (pos != -1) 3091 { 3077 3092 FIXME("Fragment program error at position %d: %s\n", pos, 3078 3093 debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); 3094 } 3095 else 3096 { 3097 GLint native; 3098 3099 GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB, &native)); 3100 checkGLcall("glGetProgramivARB()"); 3101 if (!native) WARN("Program exceeds native resource limits.\n"); 3079 3102 } 3080 3103 … … 3229 3252 BOOL dcl_tmp = args->super.srgb_correction, dcl_td = FALSE; 3230 3253 BOOL want_nv_prog = FALSE; 3231 struct arb_pshader_private *shader_priv = This->backend_priv; 3254 struct arb_pshader_private *shader_priv = This->baseShader.backend_data; 3255 GLint errPos; 3256 DWORD map; 3232 3257 3233 3258 char srgbtmp[4][4]; 3234 3259 unsigned int i, found = 0; 3235 3260 3236 for(i = 0; i < This->baseShader.limits.temporary; i++) { 3237 3238 /* Don't overwrite the color source */ 3239 if(This->color0_mov && i == This->color0_reg) continue; 3240 else if(reg_maps->shader_version.major < 2 && i == 0) continue; 3241 3242 if(reg_maps->temporary[i]) { 3243 sprintf(srgbtmp[found], "R%u", i); 3244 found++; 3245 if(found == 4) break; 3246 } 3261 for (i = 0, map = reg_maps->temporary; map; map >>= 1, ++i) 3262 { 3263 if (!(map & 1) 3264 || (This->color0_mov && i == This->color0_reg) 3265 || (reg_maps->shader_version.major < 2 && i == 0)) 3266 continue; 3267 3268 sprintf(srgbtmp[found], "R%u", i); 3269 ++found; 3270 if (found == 4) break; 3247 3271 } 3248 3272 … … 3375 3399 lconst_map, NULL, &priv_ctx); 3376 3400 3377 for(i = 0; i < (sizeof(reg_maps->bumpmat) / sizeof(reg_maps->bumpmat[0])); i++) { 3378 if(!reg_maps->bumpmat[i]) continue; 3401 for (i = 0, map = reg_maps->bumpmat; map; map >>= 1, ++i) 3402 { 3403 if (!(map & 1)) continue; 3379 3404 3380 3405 cur = compiled->numbumpenvmatconsts; … … 3398 3423 compiled->numbumpenvmatconsts = cur + 1; 3399 3424 3400 if (!reg_maps->luminanceparams[i]) continue;3425 if (!(reg_maps->luminanceparams & (1 << i))) continue; 3401 3426 3402 3427 compiled->luminanceconst[cur].const_num = next_local++; … … 3486 3511 } 3487 3512 3488 if (shader_priv->clipplane_emulation)3489 { 3490 shader_addline(buffer, "KIL fragment.texcoord[%u];\n", shader_priv->clipplane_emulation - 1);3513 if (shader_priv->clipplane_emulation != ~0U && args->clip) 3514 { 3515 shader_addline(buffer, "KIL fragment.texcoord[%u];\n", shader_priv->clipplane_emulation); 3491 3516 } 3492 3517 … … 3512 3537 GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, 3513 3538 buffer->bsize, buffer->buffer)); 3514 3515 if (glGetError() == GL_INVALID_OPERATION) { 3516 GLint errPos; 3517 glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos); 3539 checkGLcall("glProgramStringARB()"); 3540 3541 glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos); 3542 if (errPos != -1) 3543 { 3518 3544 FIXME("HW PixelShader Error at position %d: %s\n", 3519 3545 errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); 3520 3546 retval = 0; 3547 } 3548 else 3549 { 3550 GLint native; 3551 3552 GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB, &native)); 3553 checkGLcall("glGetProgramivARB()"); 3554 if (!native) WARN("Program exceeds native resource limits.\n"); 3521 3555 } 3522 3556 … … 3796 3830 struct shader_arb_ctx_priv priv_ctx; 3797 3831 unsigned int i; 3832 GLint errPos; 3798 3833 3799 3834 memset(&priv_ctx, 0, sizeof(priv_ctx)); … … 3905 3940 GL_EXTCALL(glProgramStringARB(GL_VERTEX_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, 3906 3941 buffer->bsize, buffer->buffer)); 3907 3908 if (glGetError() == GL_INVALID_OPERATION) { 3909 GLint errPos; 3910 glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos); 3942 checkGLcall("glProgramStringARB()"); 3943 3944 glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &errPos); 3945 if (errPos != -1) 3946 { 3911 3947 FIXME("HW VertexShader Error at position %d: %s\n", 3912 3948 errPos, debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); 3913 3949 ret = -1; 3914 } else { 3950 } 3951 else 3952 { 3953 GLint native; 3954 3955 GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB, &native)); 3956 checkGLcall("glGetProgramivARB()"); 3957 if (!native) WARN("Program exceeds native resource limits.\n"); 3958 3915 3959 /* Load immediate constants */ 3916 3960 if(lconst_map) { … … 3924 3968 3925 3969 return ret; 3926 }3927 3928 static void find_clip_texcoord(IWineD3DPixelShaderImpl *ps)3929 {3930 struct arb_pshader_private *shader_priv = ps->backend_priv;3931 int i;3932 const struct wined3d_gl_info *gl_info = &((IWineD3DDeviceImpl *)ps->baseShader.device)->adapter->gl_info;3933 3934 /* See if we can use fragment.texcoord[7] for clipplane emulation3935 *3936 * Don't do this if it is not supported, or fragment.texcoord[7] is used3937 */3938 if(ps->baseShader.reg_maps.shader_version.major < 3)3939 {3940 for(i = GL_LIMITS(texture_stages); i > 0; i--)3941 {3942 if(!ps->baseShader.reg_maps.texcoord[i - 1])3943 {3944 shader_priv->clipplane_emulation = i;3945 return;3946 }3947 }3948 WARN("Did not find a free clip reg(2.0)\n");3949 }3950 else3951 {3952 for(i = GL_LIMITS(texture_stages); i > 0; i--)3953 {3954 if(!(ps->baseShader.reg_maps.input_registers & (1 << (i - 1))))3955 {3956 shader_priv->clipplane_emulation = i;3957 return;3958 }3959 }3960 WARN("Did not find a free clip reg(3.0)\n");3961 }3962 3970 } 3963 3971 … … 3972 3980 GLuint ret; 3973 3981 3974 if(!shader->backend_priv) { 3982 if (!shader->baseShader.backend_data) 3983 { 3975 3984 IWineD3DDeviceImpl *device = (IWineD3DDeviceImpl *) shader->baseShader.device; 3985 const struct wined3d_gl_info *gl_info = &device->adapter->gl_info; 3976 3986 struct shader_arb_priv *priv = device->shader_priv; 3977 3987 3978 shader->ba ckend_priv= HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data));3979 shader_data = shader->ba ckend_priv;3988 shader->baseShader.backend_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data)); 3989 shader_data = shader->baseShader.backend_data; 3980 3990 shader_data->clamp_consts = shader->baseShader.reg_maps.shader_version.major == 1; 3981 3991 … … 3986 3996 TRACE("Shader got assigned input signature index %u\n", shader_data->input_signature_idx); 3987 3997 3988 if(!device->vs_clipping) find_clip_texcoord(shader); 3989 } 3990 shader_data = shader->backend_priv; 3998 if (!device->vs_clipping) 3999 shader_data->clipplane_emulation = shader_find_free_input_register(&shader->baseShader.reg_maps, 4000 GL_LIMITS(texture_stages) - 1); 4001 else 4002 shader_data->clipplane_emulation = ~0U; 4003 } 4004 shader_data = shader->baseShader.backend_data; 3991 4005 3992 4006 /* Usually we have very few GL shaders for each d3d shader(just 1 or maybe 2), … … 4062 4076 const struct wined3d_gl_info *gl_info = &((IWineD3DDeviceImpl *)shader->baseShader.device)->adapter->gl_info; 4063 4077 4064 if(!shader->backend_priv) { 4065 shader->backend_priv = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data)); 4066 } 4067 shader_data = shader->backend_priv; 4078 if (!shader->baseShader.backend_data) 4079 { 4080 shader->baseShader.backend_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*shader_data)); 4081 } 4082 shader_data = shader->baseShader.backend_data; 4068 4083 4069 4084 /* Usually we have very few GL shaders for each d3d shader(just 1 or maybe 2), … … 4130 4145 } 4131 4146 4147 /* Only enable the clip plane emulation KIL if at least one clipplane is enabled. The KIL instruction 4148 * is quite expensive because it forces the driver to disable early Z discards. It is cheaper to 4149 * duplicate the shader than have a no-op KIL instruction in every shader 4150 */ 4151 if((!((IWineD3DDeviceImpl *) shader->baseShader.device)->vs_clipping) && use_vs(stateblock) && 4152 stateblock->renderState[WINED3DRS_CLIPPING] && stateblock->renderState[WINED3DRS_CLIPPLANEENABLE]) 4153 { 4154 args->clip = 1; 4155 } 4156 else 4157 { 4158 args->clip = 0; 4159 } 4160 4132 4161 /* Skip if unused or local, or supported natively */ 4133 4162 int_skip = ~shader->baseShader.reg_maps.integer_constants | shader->baseShader.reg_maps.local_int_consts; … … 4168 4197 { 4169 4198 IWineD3DPixelShaderImpl *ps = (IWineD3DPixelShaderImpl *) stateblock->pixelShader; 4170 struct arb_pshader_private *shader_priv = ps->ba ckend_priv;4199 struct arb_pshader_private *shader_priv = ps->baseShader.backend_data; 4171 4200 args->ps_signature = shader_priv->input_signature_idx; 4172 4201 4173 args->boolclip.clip_control[0] = shader_priv->clipplane_emulation ;4202 args->boolclip.clip_control[0] = shader_priv->clipplane_emulation + 1; 4174 4203 } 4175 4204 else … … 4264 4293 * a 1.x and newer shader, reload the first 8 constants 4265 4294 */ 4266 if(priv->last_ps_const_clamped != ((struct arb_pshader_private *) ps->backend_priv)->clamp_consts)4267 { 4268 priv->last_ps_const_clamped = ((struct arb_pshader_private *) ps->backend_priv)->clamp_consts;4295 if(priv->last_ps_const_clamped != ((struct arb_pshader_private *)ps->baseShader.backend_data)->clamp_consts) 4296 { 4297 priv->last_ps_const_clamped = ((struct arb_pshader_private *)ps->baseShader.backend_data)->clamp_consts; 4269 4298 This->highest_dirty_ps_const = max(This->highest_dirty_ps_const, 8); 4270 4299 for(i = 0; i < 8; i++) … … 4382 4411 { 4383 4412 IWineD3DPixelShaderImpl *This = (IWineD3DPixelShaderImpl *) iface; 4384 struct arb_pshader_private *shader_data = This->ba ckend_priv;4413 struct arb_pshader_private *shader_data = This->baseShader.backend_data; 4385 4414 UINT i; 4386 4415 … … 4397 4426 HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders); 4398 4427 HeapFree(GetProcessHeap(), 0, shader_data); 4399 This->ba ckend_priv= NULL;4428 This->baseShader.backend_data = NULL; 4400 4429 } else { 4401 4430 IWineD3DVertexShaderImpl *This = (IWineD3DVertexShaderImpl *) iface; 4402 struct arb_vshader_private *shader_data = This->ba ckend_priv;4431 struct arb_vshader_private *shader_data = This->baseShader.backend_data; 4403 4432 UINT i; 4404 4433 … … 4415 4444 HeapFree(GetProcessHeap(), 0, shader_data->gl_shaders); 4416 4445 HeapFree(GetProcessHeap(), 0, shader_data); 4417 This->ba ckend_priv= NULL;4446 This->baseShader.backend_data = NULL; 4418 4447 } 4419 4448 } … … 4425 4454 } 4426 4455 4427 st ruct wine_rb_functions sig_tree_functions =4456 static const struct wine_rb_functions sig_tree_functions = 4428 4457 { 4429 4458 wined3d_rb_alloc, … … 4696 4725 4697 4726 static void get_loop_control_const(const struct wined3d_shader_instruction *ins, 4698 IWineD3DBaseShaderImpl *This, UINT idx, struct loop_control *loop_control)4727 IWineD3DBaseShaderImpl *This, UINT idx, struct wined3d_shader_loop_control *loop_control) 4699 4728 { 4700 4729 struct shader_arb_ctx_priv *priv = ins->ctx->backend_data; … … 5239 5268 if (use_ps(stateblock)) 5240 5269 { 5241 if(stage != 0 && 5242 ((IWineD3DPixelShaderImpl *) stateblock->pixelShader)->baseShader.reg_maps.bumpmat[stage]) { 5270 if (stage != 0 5271 && (((IWineD3DPixelShaderImpl *)stateblock->pixelShader)->baseShader.reg_maps.bumpmat & (1 << stage))) 5272 { 5243 5273 /* The pixel shader has to know the bump env matrix. Do a constants update if it isn't scheduled 5244 5274 * anyway … … 5275 5305 if (use_ps(stateblock)) 5276 5306 { 5277 if(stage != 0 && 5278 ((IWineD3DPixelShaderImpl *) stateblock->pixelShader)->baseShader.reg_maps.luminanceparams[stage]) { 5307 if (stage != 0 5308 && (((IWineD3DPixelShaderImpl *)stateblock->pixelShader)->baseShader.reg_maps.luminanceparams & (1 << stage))) 5309 { 5279 5310 /* The pixel shader has to know the luminance offset. Do a constants update if it 5280 5311 * isn't scheduled anyway … … 5530 5561 BOOL op_equal; 5531 5562 const char *final_combiner_src = "ret"; 5563 GLint pos; 5532 5564 5533 5565 /* Find out which textures are read */ … … 5763 5795 GL_EXTCALL(glGenProgramsARB(1, &ret)); 5764 5796 GL_EXTCALL(glBindProgramARB(GL_FRAGMENT_PROGRAM_ARB, ret)); 5765 GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(buffer.buffer), buffer.buffer)); 5766 5767 if (glGetError() == GL_INVALID_OPERATION) { 5768 GLint pos; 5769 glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos); 5797 GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, 5798 strlen(buffer.buffer), buffer.buffer)); 5799 checkGLcall("glProgramStringARB()"); 5800 5801 glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos); 5802 if (pos != -1) 5803 { 5770 5804 FIXME("Fragment program error at position %d: %s\n", pos, 5771 5805 debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); 5772 5806 } 5807 else 5808 { 5809 GLint native; 5810 5811 GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB, &native)); 5812 checkGLcall("glGetProgramivARB()"); 5813 if (!native) WARN("Program exceeds native resource limits.\n"); 5814 } 5815 5773 5816 shader_buffer_free(&buffer); 5774 5817 return ret; … … 6349 6392 char luminance_component; 6350 6393 struct arbfp_blit_priv *priv = device->blit_priv; 6394 GLint pos; 6351 6395 6352 6396 /* Shader header */ … … 6451 6495 6452 6496 ENTER_GL(); 6453 GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, strlen(buffer.buffer), buffer.buffer)); 6454 6455 if (glGetError() == GL_INVALID_OPERATION) { 6456 GLint pos; 6457 glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos); 6497 GL_EXTCALL(glProgramStringARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_FORMAT_ASCII_ARB, 6498 strlen(buffer.buffer), buffer.buffer)); 6499 checkGLcall("glProgramStringARB()"); 6500 6501 glGetIntegerv(GL_PROGRAM_ERROR_POSITION_ARB, &pos); 6502 if (pos != -1) 6503 { 6458 6504 FIXME("Fragment program error at position %d: %s\n", pos, 6459 6505 debugstr_a((const char *)glGetString(GL_PROGRAM_ERROR_STRING_ARB))); 6460 6506 } 6507 else 6508 { 6509 GLint native; 6510 6511 GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB, &native)); 6512 checkGLcall("glGetProgramivARB()"); 6513 if (!native) WARN("Program exceeds native resource limits.\n"); 6514 } 6515 6461 6516 shader_buffer_free(&buffer); 6462 6517 LEAVE_GL();
Note:
See TracChangeset
for help on using the changeset viewer.