From: Józef Kucia Subject: [PATCH 6/8] wined3d: Store GL sampler limits as array. Message-Id: <20170309090310.13755-6-jkucia@codeweavers.com> Date: Thu, 9 Mar 2017 10:03:08 +0100 In-Reply-To: <20170309090310.13755-1-jkucia@codeweavers.com> References: <20170309090310.13755-1-jkucia@codeweavers.com> Signed-off-by: Józef Kucia --- dlls/wined3d/arb_program_shader.c | 2 +- dlls/wined3d/directx.c | 58 +++++++++++++++++++++------------------ dlls/wined3d/glsl_shader.c | 2 +- dlls/wined3d/state.c | 2 +- dlls/wined3d/utils.c | 26 +++++++----------- dlls/wined3d/wined3d_private.h | 5 +--- 6 files changed, 45 insertions(+), 50 deletions(-) diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index 150342b..6433b24 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -5793,7 +5793,7 @@ static void arbfp_get_caps(const struct wined3d_gl_info *gl_info, struct fragmen /* TODO: Implement WINED3DTEXOPCAPS_PREMODULATE */ caps->MaxTextureBlendStages = MAX_TEXTURES; - caps->MaxSimultaneousTextures = min(gl_info->limits.fragment_samplers, MAX_TEXTURES); + caps->MaxSimultaneousTextures = min(gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL], MAX_TEXTURES); } static DWORD arbfp_get_emul_mask(const struct wined3d_gl_info *gl_info) diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index 8ef1401..1399fe1 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -3402,12 +3402,12 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info) gl_info->limits.textures = 0; gl_info->limits.texture_coords = 0; for (i = 0; i < WINED3D_SHADER_TYPE_COUNT; ++i) + { gl_info->limits.uniform_blocks[i] = 0; - gl_info->limits.fragment_samplers = 1; - gl_info->limits.vertex_samplers = 0; - gl_info->limits.geometry_samplers = 0; - gl_info->limits.compute_samplers = 0; - gl_info->limits.combined_samplers = gl_info->limits.fragment_samplers + gl_info->limits.vertex_samplers; + gl_info->limits.samplers[i] = 0; + } + gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL] = 1; + gl_info->limits.combined_samplers = gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL]; gl_info->limits.graphics_samplers = gl_info->limits.combined_samplers; gl_info->limits.vertex_attribs = 16; gl_info->limits.texture_buffer_offset_alignment = 1; @@ -3487,18 +3487,20 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info) if (gl_info->supported[ARB_FRAGMENT_PROGRAM] || gl_info->supported[ARB_FRAGMENT_SHADER]) { gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &gl_max); - gl_info->limits.fragment_samplers = gl_max; + gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL] = gl_max; } else { - gl_info->limits.fragment_samplers = gl_info->limits.textures; + gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL] = gl_info->limits.textures; } - TRACE("Max fragment samplers: %d.\n", gl_info->limits.fragment_samplers); + TRACE("Max fragment samplers: %d.\n", gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL]); if (gl_info->supported[ARB_VERTEX_SHADER]) { + unsigned int vertex_sampler_count; + gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB, &gl_max); - gl_info->limits.vertex_samplers = gl_max; + vertex_sampler_count = gl_info->limits.samplers[WINED3D_SHADER_TYPE_VERTEX] = gl_max; gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB, &gl_max); gl_info->limits.combined_samplers = gl_max; gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_VERTEX_ATTRIBS_ARB, &gl_max); @@ -3518,23 +3520,24 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info) * * So this is just a check to check that our assumption holds true. If not, write a warning * and reduce the number of vertex samplers or probably disable vertex texture fetch. */ - if (gl_info->limits.vertex_samplers && gl_info->limits.combined_samplers < 12 - && MAX_TEXTURES + gl_info->limits.vertex_samplers > gl_info->limits.combined_samplers) + if (vertex_sampler_count && gl_info->limits.combined_samplers < 12 + && MAX_TEXTURES + vertex_sampler_count > gl_info->limits.combined_samplers) { FIXME("OpenGL implementation supports %u vertex samplers and %u total samplers.\n", - gl_info->limits.vertex_samplers, gl_info->limits.combined_samplers); + vertex_sampler_count, gl_info->limits.combined_samplers); FIXME("Expected vertex samplers + MAX_TEXTURES(=8) > combined_samplers.\n"); if (gl_info->limits.combined_samplers > MAX_TEXTURES) - gl_info->limits.vertex_samplers = gl_info->limits.combined_samplers - MAX_TEXTURES; + vertex_sampler_count = gl_info->limits.combined_samplers - MAX_TEXTURES; else - gl_info->limits.vertex_samplers = 0; + vertex_sampler_count = 0; + gl_info->limits.samplers[WINED3D_SHADER_TYPE_VERTEX] = vertex_sampler_count; } } else { - gl_info->limits.combined_samplers = gl_info->limits.fragment_samplers; + gl_info->limits.combined_samplers = gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL]; } - TRACE("Max vertex samplers: %u.\n", gl_info->limits.vertex_samplers); + TRACE("Max vertex samplers: %u.\n", gl_info->limits.samplers[WINED3D_SHADER_TYPE_VERTEX]); TRACE("Max combined samplers: %u.\n", gl_info->limits.combined_samplers); TRACE("Max vertex attributes: %u.\n", gl_info->limits.vertex_attribs); } @@ -3619,8 +3622,8 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info) TRACE("Max geometry uniform blocks: %u (%d).\n", gl_info->limits.uniform_blocks[WINED3D_SHADER_TYPE_GEOMETRY], gl_max); gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS, &gl_max); - gl_info->limits.geometry_samplers = gl_max; - TRACE("Max geometry samplers: %u.\n", gl_info->limits.geometry_samplers); + gl_info->limits.samplers[WINED3D_SHADER_TYPE_GEOMETRY] = gl_max; + TRACE("Max geometry samplers: %u.\n", gl_info->limits.samplers[WINED3D_SHADER_TYPE_GEOMETRY]); } if (gl_info->supported[ARB_FRAGMENT_SHADER]) { @@ -3646,8 +3649,8 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info) TRACE("Max compute uniform blocks: %u (%d).\n", gl_info->limits.uniform_blocks[WINED3D_SHADER_TYPE_COMPUTE], gl_max); gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS, &gl_max); - gl_info->limits.compute_samplers = gl_max; - TRACE("Max compute samplers: %u.\n", gl_info->limits.compute_samplers); + gl_info->limits.samplers[WINED3D_SHADER_TYPE_COMPUTE] = gl_max; + TRACE("Max compute samplers: %u.\n", gl_info->limits.samplers[WINED3D_SHADER_TYPE_COMPUTE]); } if (gl_info->supported[ARB_UNIFORM_BUFFER_OBJECT]) { @@ -3692,8 +3695,9 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info) gl_info->limits.samples = gl_max; } - sampler_count = gl_info->limits.vertex_samplers + gl_info->limits.fragment_samplers - + gl_info->limits.geometry_samplers; + sampler_count = 0; + for (i = 0; i < WINED3D_SHADER_TYPE_GRAPHICS_COUNT; ++i) + sampler_count += gl_info->limits.samplers[i]; if (gl_info->supported[WINED3D_GL_VERSION_3_2] && gl_info->limits.combined_samplers < sampler_count) { /* The minimum value for GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS in OpenGL @@ -3701,16 +3705,16 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info) * the minimum value is increased to 80. */ WARN("Graphics pipeline sampler count %u is greater than combined sampler count %u.\n", sampler_count, gl_info->limits.combined_samplers); - gl_info->limits.fragment_samplers = min(16, gl_info->limits.fragment_samplers); - gl_info->limits.vertex_samplers = min(16, gl_info->limits.vertex_samplers); - gl_info->limits.geometry_samplers = min(16, gl_info->limits.geometry_samplers); + for (i = 0; i < WINED3D_SHADER_TYPE_GRAPHICS_COUNT; ++i) + gl_info->limits.samplers[i] = min(gl_info->limits.samplers[i], 16); } /* A majority of OpenGL implementations allow to statically partition * the set of texture bindings into six separate sets. */ gl_info->limits.graphics_samplers = gl_info->limits.combined_samplers; - if (gl_info->limits.combined_samplers >= sampler_count + gl_info->limits.compute_samplers) - gl_info->limits.graphics_samplers -= gl_info->limits.compute_samplers; + sampler_count += gl_info->limits.samplers[WINED3D_SHADER_TYPE_COMPUTE]; + if (gl_info->limits.combined_samplers >= sampler_count) + gl_info->limits.graphics_samplers -= gl_info->limits.samplers[WINED3D_SHADER_TYPE_COMPUTE]; } /* Context activation is done by the caller. */ diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index dcc1c31..4004bca 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -10405,7 +10405,7 @@ static void glsl_fragment_pipe_get_caps(const struct wined3d_gl_info *gl_info, s | WINED3DTEXOPCAPS_BUMPENVMAP | WINED3DTEXOPCAPS_BUMPENVMAPLUMINANCE; caps->MaxTextureBlendStages = MAX_TEXTURES; - caps->MaxSimultaneousTextures = min(gl_info->limits.fragment_samplers, MAX_TEXTURES); + caps->MaxSimultaneousTextures = min(gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL], MAX_TEXTURES); } static DWORD glsl_fragment_pipe_get_emul_mask(const struct wined3d_gl_info *gl_info) diff --git a/dlls/wined3d/state.c b/dlls/wined3d/state.c index 461b52e..49ff9dc 100644 --- a/dlls/wined3d/state.c +++ b/dlls/wined3d/state.c @@ -3323,7 +3323,7 @@ static void tex_coordindex(struct wined3d_context *context, const struct wined3d return; } - if (mapped_stage >= min(gl_info->limits.fragment_samplers, MAX_FRAGMENT_SAMPLERS)) + if (mapped_stage >= min(gl_info->limits.samplers[WINED3D_SHADER_TYPE_PIXEL], MAX_FRAGMENT_SAMPLERS)) { WARN("stage %u not mapped to a valid texture unit (%u)\n", stage, mapped_stage); return; diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index d9d6f87..14f3478 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -2759,7 +2759,7 @@ static void query_internal_format(struct wined3d_adapter *adapter, } else { - if (!gl_info->limits.vertex_samplers) + if (!gl_info->limits.samplers[WINED3D_SHADER_TYPE_VERTEX]) format_clear_flag(format, WINED3DFMT_FLAG_VTF); if (!(gl_info->quirks & WINED3D_QUIRK_LIMITED_TEX_FILTERING)) @@ -6033,26 +6033,20 @@ void context_get_texture_unit_range(const struct wined3d_context *context, *base = 0; else *base = gl_limits->graphics_samplers - 1; - *count = gl_limits->compute_samplers; + *count = gl_limits->samplers[WINED3D_SHADER_TYPE_COMPUTE]; return; } *base = 0; - *count = gl_limits->fragment_samplers; - if (shader_type == WINED3D_SHADER_TYPE_PIXEL) - return; - - *base += *count; - *count = gl_limits->vertex_samplers; - if (shader_type == WINED3D_SHADER_TYPE_VERTEX) - return; - - *base += *count; - *count = gl_limits->geometry_samplers; - if (shader_type == WINED3D_SHADER_TYPE_GEOMETRY) - return; + for (i = 0; i < WINED3D_SHADER_TYPE_GRAPHICS_COUNT; ++i) + { + *count = gl_limits->samplers[i]; + if (i == shader_type) + return; + *base += *count; + } - *base += *count; + ERR("Unrecognized shader type %#x.\n", shader_type); *count = 0; } diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 5bfdef7..3c8f977 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -2261,10 +2261,7 @@ struct wined3d_gl_limits UINT textures; UINT texture_coords; unsigned int uniform_blocks[WINED3D_SHADER_TYPE_COUNT]; - unsigned int fragment_samplers; - unsigned int vertex_samplers; - unsigned int geometry_samplers; - unsigned int compute_samplers; + unsigned int samplers[WINED3D_SHADER_TYPE_COUNT]; unsigned int graphics_samplers; unsigned int combined_samplers; UINT general_combiners; -- 2.10.2