=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: wined3d: Add ARB_shader_atomic_counters extension.

Alexandre Julliard julliard at winehq.org
Fri Mar 3 14:20:35 CST 2017


Module: wine
Branch: master
Commit: c56554168557eab90f3180ddf993389965ff86b4
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=c56554168557eab90f3180ddf993389965ff86b4

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Fri Mar  3 01:30:29 2017 +0100

wined3d: Add ARB_shader_atomic_counters extension.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/wined3d/directx.c     | 21 +++++++++++++++++++++
 dlls/wined3d/glsl_shader.c |  3 +++
 dlls/wined3d/wined3d_gl.h  |  1 +
 3 files changed, 25 insertions(+)

diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 5fa34e5..425d1fd 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -147,6 +147,7 @@ static const struct wined3d_extension_map gl_extension_map[] =
     {"GL_ARB_point_sprite",                 ARB_POINT_SPRITE              },
     {"GL_ARB_provoking_vertex",             ARB_PROVOKING_VERTEX          },
     {"GL_ARB_sampler_objects",              ARB_SAMPLER_OBJECTS           },
+    {"GL_ARB_shader_atomic_counters",       ARB_SHADER_ATOMIC_COUNTERS    },
     {"GL_ARB_shader_bit_encoding",          ARB_SHADER_BIT_ENCODING       },
     {"GL_ARB_shader_image_load_store",      ARB_SHADER_IMAGE_LOAD_STORE   },
     {"GL_ARB_shader_image_size",            ARB_SHADER_IMAGE_SIZE         },
@@ -2788,6 +2789,8 @@ static void load_gl_funcs(struct wined3d_gl_info *gl_info)
     USE_GL_FUNC(glGetSamplerParameterfv)
     USE_GL_FUNC(glGetSamplerParameterIiv)
     USE_GL_FUNC(glGetSamplerParameterIuiv)
+    /* GL_ARB_shader_atomic_counters */
+    USE_GL_FUNC(glGetActiveAtomicCounterBufferiv)
     /* GL_ARB_shader_image_load_store */
     USE_GL_FUNC(glBindImageTexture)
     USE_GL_FUNC(glMemoryBarrier)
@@ -3659,6 +3662,23 @@ static void wined3d_adapter_init_limits(struct wined3d_gl_info *gl_info)
         gl_info->limits.texture_buffer_offset_alignment = gl_max;
         TRACE("Minimum required texture buffer offset alignment %d.\n", gl_max);
     }
+    if (gl_info->supported[ARB_SHADER_ATOMIC_COUNTERS])
+    {
+        GLint max_fragment_buffers, max_combined_buffers, max_bindings;
+        gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS, &max_fragment_buffers);
+        TRACE("Max fragment atomic counter buffers: %d.\n", max_fragment_buffers);
+        gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS, &max_combined_buffers);
+        TRACE("Max combined atomic counter buffers: %d.\n", max_combined_buffers);
+        gl_info->gl_ops.gl.p_glGetIntegerv(GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS, &max_bindings);
+        TRACE("Max atomic counter buffer bindings: %d.\n", max_bindings);
+        if (max_fragment_buffers < MAX_UNORDERED_ACCESS_VIEWS
+                || max_combined_buffers < MAX_UNORDERED_ACCESS_VIEWS
+                || max_bindings < MAX_UNORDERED_ACCESS_VIEWS)
+        {
+            WARN("Disabling ARB_shader_atomic_counters.\n");
+            gl_info->supported[ARB_SHADER_ATOMIC_COUNTERS] = FALSE;
+        }
+    }
 
     if (gl_info->supported[NV_LIGHT_MAX_EXPONENT])
         gl_info->gl_ops.gl.p_glGetFloatv(GL_MAX_SHININESS_NV, &gl_info->limits.shininess);
@@ -3766,6 +3786,7 @@ static BOOL wined3d_adapter_init_gl_caps(struct wined3d_adapter *adapter,
 
         {ARB_INTERNALFORMAT_QUERY,         MAKEDWORD_VERSION(4, 2)},
         {ARB_MAP_BUFFER_ALIGNMENT,         MAKEDWORD_VERSION(4, 2)},
+        {ARB_SHADER_ATOMIC_COUNTERS,       MAKEDWORD_VERSION(4, 2)},
         {ARB_SHADER_IMAGE_LOAD_STORE,      MAKEDWORD_VERSION(4, 2)},
         {ARB_SHADING_LANGUAGE_420PACK,     MAKEDWORD_VERSION(4, 2)},
         {ARB_SHADING_LANGUAGE_PACKING,     MAKEDWORD_VERSION(4, 2)},
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index c6d2e39..9b1d5ee 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -6619,6 +6619,8 @@ static void shader_glsl_enable_extensions(struct wined3d_string_buffer *buffer,
 {
     if (gl_info->supported[ARB_GPU_SHADER5])
         shader_addline(buffer, "#extension GL_ARB_gpu_shader5 : enable\n");
+    if (gl_info->supported[ARB_SHADER_ATOMIC_COUNTERS])
+        shader_addline(buffer, "#extension GL_ARB_shader_atomic_counters : enable\n");
     if (gl_info->supported[ARB_SHADER_BIT_ENCODING])
         shader_addline(buffer, "#extension GL_ARB_shader_bit_encoding : enable\n");
     if (gl_info->supported[ARB_SHADER_IMAGE_LOAD_STORE])
@@ -9444,6 +9446,7 @@ static void shader_glsl_get_caps(const struct wined3d_gl_info *gl_info, struct s
             && gl_info->supported[ARB_COMPUTE_SHADER]
             && gl_info->supported[ARB_DERIVATIVE_CONTROL]
             && gl_info->supported[ARB_GPU_SHADER5]
+            && gl_info->supported[ARB_SHADER_ATOMIC_COUNTERS]
             && gl_info->supported[ARB_SHADER_IMAGE_LOAD_STORE]
             && gl_info->supported[ARB_SHADER_IMAGE_SIZE]
             && gl_info->supported[ARB_SHADING_LANGUAGE_PACKING])
diff --git a/dlls/wined3d/wined3d_gl.h b/dlls/wined3d/wined3d_gl.h
index fa5985c..00fb7cb 100644
--- a/dlls/wined3d/wined3d_gl.h
+++ b/dlls/wined3d/wined3d_gl.h
@@ -80,6 +80,7 @@ enum wined3d_gl_extension
     ARB_POINT_SPRITE,
     ARB_PROVOKING_VERTEX,
     ARB_SAMPLER_OBJECTS,
+    ARB_SHADER_ATOMIC_COUNTERS,
     ARB_SHADER_BIT_ENCODING,
     ARB_SHADER_IMAGE_LOAD_STORE,
     ARB_SHADER_IMAGE_SIZE,




More information about the wine-cvs mailing list