From 0c263cec1c4390bcaf1c60c2b9bcb35989c6da51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20D=C3=B6singer?= Date: Wed, 7 Oct 2009 21:38:25 +0200 Subject: [PATCH 01/18] WineD3D: Make shader specific constants accessible via GL_LIMITS --- dlls/wined3d/arb_program_shader.c | 2 +- dlls/wined3d/directx.c | 82 ++++++++++++++++++------------------ dlls/wined3d/glsl_shader.c | 4 +- dlls/wined3d/wined3d_gl.h | 18 ++++---- 4 files changed, 53 insertions(+), 53 deletions(-) diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index 39bd0b5..c588c13 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -3481,7 +3481,7 @@ static GLuint shader_arb_generate_pshader(IWineD3DPixelShaderImpl *This, struct struct arb_ps_np2fixup_info* const fixup = priv_ctx.cur_np2fixup_info; const WORD map = priv_ctx.cur_ps_args->super.np2_fixup; - const UINT max_lconsts = gl_info->ps_arb_max_local_constants; + const UINT max_lconsts = GL_LIMITS(ps_arb_local_constants); fixup->offset = next_local; fixup->super.active = 0; diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index 18ac560..dd62373 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -417,10 +417,10 @@ static void select_shader_max_constants(int ps_selected_mode, int vs_selected_mo { switch (vs_selected_mode) { case SHADER_GLSL: - gl_info->max_vshader_constantsF = gl_info->vs_glsl_constantsF; + gl_info->max_vshader_constantsF = gl_info->max_vs_glsl_constantsF; break; case SHADER_ARB: - gl_info->max_vshader_constantsF = gl_info->vs_arb_constantsF; + gl_info->max_vshader_constantsF = gl_info->max_vs_arb_constantsF; break; default: gl_info->max_vshader_constantsF = 0; @@ -429,10 +429,10 @@ static void select_shader_max_constants(int ps_selected_mode, int vs_selected_mo switch (ps_selected_mode) { case SHADER_GLSL: - gl_info->max_pshader_constantsF = gl_info->ps_glsl_constantsF; + gl_info->max_pshader_constantsF = gl_info->max_ps_glsl_constantsF; break; case SHADER_ARB: - gl_info->max_pshader_constantsF = gl_info->ps_arb_constantsF; + gl_info->max_pshader_constantsF = gl_info->max_ps_arb_constantsF; break; default: gl_info->max_pshader_constantsF = 0; @@ -720,10 +720,10 @@ static BOOL match_broken_nv_clip(const struct wined3d_gl_info *gl_info, const ch static void quirk_arb_constants(struct wined3d_gl_info *gl_info) { - TRACE_(d3d_caps)("Using ARB vs constant limit(=%u) for GLSL.\n", gl_info->vs_arb_constantsF); - gl_info->vs_glsl_constantsF = gl_info->vs_arb_constantsF; - TRACE_(d3d_caps)("Using ARB ps constant limit(=%u) for GLSL.\n", gl_info->ps_arb_constantsF); - gl_info->ps_glsl_constantsF = gl_info->ps_arb_constantsF; + TRACE_(d3d_caps)("Using ARB vs constant limit(=%u) for GLSL.\n", gl_info->max_vs_arb_constantsF); + gl_info->max_vs_glsl_constantsF = gl_info->max_vs_arb_constantsF; + TRACE_(d3d_caps)("Using ARB ps constant limit(=%u) for GLSL.\n", gl_info->max_ps_arb_constantsF); + gl_info->max_ps_glsl_constantsF = gl_info->max_ps_arb_constantsF; } static void quirk_apple_glsl_constants(struct wined3d_gl_info *gl_info) @@ -1611,15 +1611,15 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_gl_info *gl_info) gl_info->max_vertex_samplers = 0; gl_info->max_combined_samplers = gl_info->max_fragment_samplers + gl_info->max_vertex_samplers; gl_info->max_sampler_stages = 1; - gl_info->ps_arb_max_temps = 0; - gl_info->ps_arb_max_instructions = 0; - gl_info->vs_arb_max_temps = 0; - gl_info->vs_arb_max_instructions = 0; - gl_info->vs_glsl_constantsF = 0; - gl_info->ps_glsl_constantsF = 0; - gl_info->vs_arb_constantsF = 0; - gl_info->ps_arb_constantsF = 0; - gl_info->ps_arb_max_local_constants = 0; + gl_info->max_ps_arb_temps = 0; + gl_info->max_ps_arb_instructions = 0; + gl_info->max_vs_arb_temps = 0; + gl_info->max_vs_arb_instructions = 0; + gl_info->max_vs_glsl_constantsF = 0; + gl_info->max_ps_glsl_constantsF = 0; + gl_info->max_vs_arb_constantsF = 0; + gl_info->max_ps_arb_constantsF = 0; + gl_info->max_ps_arb_local_constants = 0; /* Retrieve opengl defaults */ glGetIntegerv(GL_MAX_CLIP_PLANES, &gl_max); @@ -1860,43 +1860,43 @@ static BOOL IWineD3DImpl_FillGLCaps(struct wined3d_gl_info *gl_info) if (gl_info->supported[ARB_FRAGMENT_PROGRAM]) { GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_ENV_PARAMETERS_ARB, &gl_max)); - gl_info->ps_arb_constantsF = gl_max; - TRACE_(d3d_caps)("Max ARB_FRAGMENT_PROGRAM float constants: %d.\n", gl_info->ps_arb_constantsF); + gl_info->max_ps_arb_constantsF = gl_max; + TRACE_(d3d_caps)("Max ARB_FRAGMENT_PROGRAM float constants: %d.\n", gl_info->max_ps_arb_constantsF); GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB, &gl_max)); - gl_info->ps_arb_max_temps = gl_max; - TRACE_(d3d_caps)("Max ARB_FRAGMENT_PROGRAM native temporaries: %d.\n", gl_info->ps_arb_max_temps); + gl_info->max_ps_arb_temps = gl_max; + TRACE_(d3d_caps)("Max ARB_FRAGMENT_PROGRAM native temporaries: %d.\n", gl_info->max_ps_arb_temps); GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB, &gl_max)); - gl_info->ps_arb_max_instructions = gl_max; - TRACE_(d3d_caps)("Max ARB_FRAGMENT_PROGRAM native instructions: %d.\n", gl_info->ps_arb_max_instructions); + gl_info->max_ps_arb_instructions = gl_max; + TRACE_(d3d_caps)("Max ARB_FRAGMENT_PROGRAM native instructions: %d.\n", gl_info->max_ps_arb_instructions); GL_EXTCALL(glGetProgramivARB(GL_FRAGMENT_PROGRAM_ARB, GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB, &gl_max)); - gl_info->ps_arb_max_local_constants = gl_max; - TRACE_(d3d_caps)("Max ARB_FRAGMENT_PROGRAM local parameters: %d.\n", gl_info->ps_arb_max_instructions); + gl_info->max_ps_arb_local_constants = gl_max; + TRACE_(d3d_caps)("Max ARB_FRAGMENT_PROGRAM local parameters: %d.\n", gl_info->max_ps_arb_instructions); } if (gl_info->supported[ARB_VERTEX_PROGRAM]) { GL_EXTCALL(glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_ENV_PARAMETERS_ARB, &gl_max)); - gl_info->vs_arb_constantsF = gl_max; - TRACE_(d3d_caps)("Max ARB_VERTEX_PROGRAM float constants: %d.\n", gl_info->vs_arb_constantsF); + gl_info->max_vs_arb_constantsF = gl_max; + TRACE_(d3d_caps)("Max ARB_VERTEX_PROGRAM float constants: %d.\n", gl_info->max_vs_arb_constantsF); GL_EXTCALL(glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB, &gl_max)); - gl_info->vs_arb_max_temps = gl_max; - TRACE_(d3d_caps)("Max ARB_VERTEX_PROGRAM native temporaries: %d.\n", gl_info->vs_arb_max_temps); + gl_info->max_vs_arb_temps = gl_max; + TRACE_(d3d_caps)("Max ARB_VERTEX_PROGRAM native temporaries: %d.\n", gl_info->max_vs_arb_temps); GL_EXTCALL(glGetProgramivARB(GL_VERTEX_PROGRAM_ARB, GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB, &gl_max)); - gl_info->vs_arb_max_instructions = gl_max; - TRACE_(d3d_caps)("Max ARB_VERTEX_PROGRAM native instructions: %d.\n", gl_info->vs_arb_max_instructions); + gl_info->max_vs_arb_instructions = gl_max; + TRACE_(d3d_caps)("Max ARB_VERTEX_PROGRAM native instructions: %d.\n", gl_info->max_vs_arb_instructions); if (test_arb_vs_offset_limit(gl_info)) gl_info->quirks |= WINED3D_QUIRK_ARB_VS_OFFSET_LIMIT; } if (gl_info->supported[ARB_VERTEX_SHADER]) { glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB, &gl_max); - gl_info->vs_glsl_constantsF = gl_max / 4; - TRACE_(d3d_caps)("Max ARB_VERTEX_SHADER float constants: %u.\n", gl_info->vs_glsl_constantsF); + gl_info->max_vs_glsl_constantsF = gl_max / 4; + TRACE_(d3d_caps)("Max ARB_VERTEX_SHADER float constants: %u.\n", gl_info->max_vs_glsl_constantsF); } if (gl_info->supported[ARB_FRAGMENT_SHADER]) { glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB, &gl_max); - gl_info->ps_glsl_constantsF = gl_max / 4; - TRACE_(d3d_caps)("Max ARB_FRAGMENT_SHADER float constants: %u.\n", gl_info->ps_glsl_constantsF); + gl_info->max_ps_glsl_constantsF = gl_max / 4; + TRACE_(d3d_caps)("Max ARB_FRAGMENT_SHADER float constants: %u.\n", gl_info->max_ps_glsl_constantsF); glGetIntegerv(GL_MAX_VARYING_FLOATS_ARB, &gl_max); gl_info->max_glsl_varyings = gl_max; TRACE_(d3d_caps)("Max GLSL varyings: %u (%u 4 component varyings).\n", gl_max, gl_max / 4); @@ -4186,15 +4186,15 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter, use the VS 3.0 from MSDN or else if there's OpenGL spec use a hardcoded value minimum VS3.0 value. */ pCaps->VS20Caps.Caps = WINED3DVS20CAPS_PREDICATION; pCaps->VS20Caps.DynamicFlowControlDepth = WINED3DVS20_MAX_DYNAMICFLOWCONTROLDEPTH; /* VS 3.0 requires MAX_DYNAMICFLOWCONTROLDEPTH (24) */ - pCaps->VS20Caps.NumTemps = max(32, adapter->gl_info.vs_arb_max_temps); + pCaps->VS20Caps.NumTemps = max(32, adapter->gl_info.max_vs_arb_temps); pCaps->VS20Caps.StaticFlowControlDepth = WINED3DVS20_MAX_STATICFLOWCONTROLDEPTH ; /* level of nesting in loops / if-statements; VS 3.0 requires MAX (4) */ pCaps->MaxVShaderInstructionsExecuted = 65535; /* VS 3.0 needs at least 65535, some cards even use 2^32-1 */ - pCaps->MaxVertexShader30InstructionSlots = max(512, adapter->gl_info.vs_arb_max_instructions); + pCaps->MaxVertexShader30InstructionSlots = max(512, adapter->gl_info.max_vs_arb_instructions); } else if(pCaps->VertexShaderVersion == WINED3DVS_VERSION(2,0)) { pCaps->VS20Caps.Caps = 0; pCaps->VS20Caps.DynamicFlowControlDepth = WINED3DVS20_MIN_DYNAMICFLOWCONTROLDEPTH; - pCaps->VS20Caps.NumTemps = max(12, adapter->gl_info.vs_arb_max_temps); + pCaps->VS20Caps.NumTemps = max(12, adapter->gl_info.max_vs_arb_temps); pCaps->VS20Caps.StaticFlowControlDepth = 1; pCaps->MaxVShaderInstructionsExecuted = 65535; @@ -4220,17 +4220,17 @@ static HRESULT WINAPI IWineD3DImpl_GetDeviceCaps(IWineD3D *iface, UINT Adapter, WINED3DPS20CAPS_NODEPENDENTREADLIMIT | WINED3DPS20CAPS_NOTEXINSTRUCTIONLIMIT; pCaps->PS20Caps.DynamicFlowControlDepth = WINED3DPS20_MAX_DYNAMICFLOWCONTROLDEPTH; /* PS 3.0 requires MAX_DYNAMICFLOWCONTROLDEPTH (24) */ - pCaps->PS20Caps.NumTemps = max(32, adapter->gl_info.ps_arb_max_temps); + pCaps->PS20Caps.NumTemps = max(32, adapter->gl_info.max_ps_arb_temps); pCaps->PS20Caps.StaticFlowControlDepth = WINED3DPS20_MAX_STATICFLOWCONTROLDEPTH; /* PS 3.0 requires MAX_STATICFLOWCONTROLDEPTH (4) */ pCaps->PS20Caps.NumInstructionSlots = WINED3DPS20_MAX_NUMINSTRUCTIONSLOTS; /* PS 3.0 requires MAX_NUMINSTRUCTIONSLOTS (512) */ pCaps->MaxPShaderInstructionsExecuted = 65535; - pCaps->MaxPixelShader30InstructionSlots = max(WINED3DMIN30SHADERINSTRUCTIONS, adapter->gl_info.ps_arb_max_instructions); + pCaps->MaxPixelShader30InstructionSlots = max(WINED3DMIN30SHADERINSTRUCTIONS, adapter->gl_info.max_ps_arb_instructions); } else if(pCaps->PixelShaderVersion == WINED3DPS_VERSION(2,0)) { /* Below we assume PS2.0 specs, not extended 2.0a(GeforceFX)/2.0b(Radeon R3xx) ones */ pCaps->PS20Caps.Caps = 0; pCaps->PS20Caps.DynamicFlowControlDepth = 0; /* WINED3DVS20_MIN_DYNAMICFLOWCONTROLDEPTH = 0 */ - pCaps->PS20Caps.NumTemps = max(12, adapter->gl_info.ps_arb_max_temps); + pCaps->PS20Caps.NumTemps = max(12, adapter->gl_info.max_ps_arb_temps); pCaps->PS20Caps.StaticFlowControlDepth = WINED3DPS20_MIN_STATICFLOWCONTROLDEPTH; /* Minimum: 1 */ pCaps->PS20Caps.NumInstructionSlots = WINED3DPS20_MIN_NUMINSTRUCTIONSLOTS; /* Minimum number (64 ALU + 32 Texture), a GeforceFX uses 512 */ diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index a8922d8..9402432 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -4611,7 +4611,7 @@ static void shader_glsl_get_caps(WINED3DDEVTYPE devtype, * of native instructions, so use that here. For more info see the pixel shader versioning code below. */ if ((gl_info->supported[NV_VERTEX_PROGRAM2] && !gl_info->supported[NV_VERTEX_PROGRAM3]) - || gl_info->ps_arb_max_instructions <= 512) + || gl_info->max_ps_arb_instructions <= 512) pCaps->VertexShaderVersion = WINED3DVS_VERSION(2,0); else pCaps->VertexShaderVersion = WINED3DVS_VERSION(3,0); @@ -4630,7 +4630,7 @@ static void shader_glsl_get_caps(WINED3DDEVTYPE devtype, * NOTE: ps3.0 hardware requires 512 or more instructions but ati and nvidia offer 'enough' (1024 vs 4096) on their most basic ps3.0 hardware. */ if ((gl_info->supported[NV_FRAGMENT_PROGRAM] && !gl_info->supported[NV_FRAGMENT_PROGRAM2]) - || (gl_info->ps_arb_max_instructions <= 512)) + || (gl_info->max_ps_arb_instructions <= 512)) pCaps->PixelShaderVersion = WINED3DPS_VERSION(2,0); else pCaps->PixelShaderVersion = WINED3DPS_VERSION(3,0); diff --git a/dlls/wined3d/wined3d_gl.h b/dlls/wined3d/wined3d_gl.h index 1030931..e77be8b 100644 --- a/dlls/wined3d/wined3d_gl.h +++ b/dlls/wined3d/wined3d_gl.h @@ -4166,15 +4166,15 @@ struct wined3d_gl_info unsigned int max_vshader_constantsF; unsigned int max_pshader_constantsF; - unsigned int vs_arb_constantsF; - unsigned int vs_arb_max_instructions; - unsigned int vs_arb_max_temps; - unsigned int ps_arb_constantsF; - unsigned int ps_arb_max_local_constants; - unsigned int ps_arb_max_instructions; - unsigned int ps_arb_max_temps; - unsigned int vs_glsl_constantsF; - unsigned int ps_glsl_constantsF; + unsigned int max_vs_arb_constantsF; + unsigned int max_vs_arb_instructions; + unsigned int max_vs_arb_temps; + unsigned int max_ps_arb_constantsF; + unsigned int max_ps_arb_local_constants; + unsigned int max_ps_arb_instructions; + unsigned int max_ps_arb_temps; + unsigned int max_vs_glsl_constantsF; + unsigned int max_ps_glsl_constantsF; DWORD reserved_glsl_constants; -- 1.6.4.4