From: Guillaume Charifi Subject: [PATCH 02/10] wined3d: Probe for compute shader limits. Message-Id: <20170129134354.28597-2-guillaume.charifi@sfr.fr> Date: Sun, 29 Jan 2017 14:43:33 +0100 In-Reply-To: <20170129134354.28597-1-guillaume.charifi@sfr.fr> References: <20170129134354.28597-1-guillaume.charifi@sfr.fr> Signed-off-by: Guillaume Charifi --- dlls/wined3d/directx.c | 7 +++++++ dlls/wined3d/utils.c | 6 ++++++ dlls/wined3d/wined3d_private.h | 2 ++ 3 files changed, 15 insertions(+) diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c index 037883c..9169942 100644 --- a/dlls/wined3d/directx.c +++ b/dlls/wined3d/directx.c @@ -3345,6 +3345,7 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info) gl_info->limits.vertex_uniform_blocks = 0; gl_info->limits.geometry_uniform_blocks = 0; gl_info->limits.fragment_uniform_blocks = 0; + gl_info->limits.compute_uniform_blocks = 0; gl_info->limits.fragment_samplers = 1; gl_info->limits.vertex_samplers = 0; gl_info->limits.combined_samplers = gl_info->limits.fragment_samplers + gl_info->limits.vertex_samplers; @@ -3551,6 +3552,12 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info) TRACE("Max fragment uniform blocks: %u (%d).\n", gl_info->limits.fragment_uniform_blocks, gl_max); } } + if (gl_info->supported[ARB_COMPUTE_SHADER] && gl_info->supported[ARB_UNIFORM_BUFFER_OBJECT]) + { + gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_COMPUTE_UNIFORM_BLOCKS, &gl_max); + gl_info->limits.compute_uniform_blocks = min(gl_max, WINED3D_MAX_CBS); + TRACE("Max compute uniform blocks: %u (%d).\n", gl_info->limits.compute_uniform_blocks, gl_max); + } if (gl_info->supported[ARB_UNIFORM_BUFFER_OBJECT]) { gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_COMBINED_UNIFORM_BLOCKS, &gl_max); diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index e9ee90a..951e7ee 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -5924,6 +5924,12 @@ void wined3d_gl_limits_get_uniform_block_range(const struct wined3d_gl_limits *g return; *base += *count; + *count = gl_limits->compute_uniform_blocks; + + if (shader_type == WINED3D_SHADER_TYPE_COMPUTE) + return; + + *base += *count; *count = 0; ERR("Unhandled shader type %#x.\n", shader_type); diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 2fe5668..708d215 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -179,6 +179,7 @@ static inline enum complex_fixup get_complex_fixup(struct color_fixup_desc fixup #define MAX_FRAGMENT_SAMPLERS 16 #define MAX_VERTEX_SAMPLERS 4 #define MAX_COMBINED_SAMPLERS (MAX_FRAGMENT_SAMPLERS + MAX_VERTEX_SAMPLERS) +#define MAX_COMPUTE_SAMPLERS 16 #define MAX_ACTIVE_LIGHTS 8 #define MAX_CLIP_DISTANCES WINED3DMAXUSERCLIPPLANES #define MAX_CONSTANT_BUFFERS 15 @@ -2143,6 +2144,7 @@ struct wined3d_gl_limits unsigned int vertex_uniform_blocks; unsigned int geometry_uniform_blocks; unsigned int fragment_uniform_blocks; + unsigned int compute_uniform_blocks; UINT fragment_samplers; UINT vertex_samplers; UINT combined_samplers; -- Guillaume Charifi