[Mesa-dev] [RFC 45/63] mesa/formatquery: Added SHADER_IMAGE_{LOAD, STORE, ATOMIC} <pname> queries

Eduardo Lima Mitev elima at igalia.com
Tue Jan 19 08:42:25 PST 2016


From: Antia Puentes <apuentes at igalia.com>

>From the ARB_internalformat_query2 specification:

    "- SHADER_IMAGE_LOAD: The support for using the resource with image load
      operations in shaders is written to <params>.
      In this case the <internalformat> is the value of the <format> parameter
      that would be passed to BindImageTexture.

    - SHADER_IMAGE_STORE: The support for using the resource with image store
      operations in shaders is written to <params>.
      In this case the <internalformat> is the value of the <format> parameter
      that is passed to BindImageTexture.

    - SHADER_IMAGE_ATOMIC: The support for using the resource with atomic
      memory operations from shaders is written to <params>."

For all of them:

    "Possible values returned are FULL_SUPPORT, CAVEAT_SUPPORT, or NONE.
     If the resource or operation is not supported, NONE is returned."
---
 src/mesa/main/formatquery.c | 29 ++++++++++++++++++++++++-----
 1 file changed, 24 insertions(+), 5 deletions(-)

diff --git a/src/mesa/main/formatquery.c b/src/mesa/main/formatquery.c
index 925c7af..6ed3cc8 100644
--- a/src/mesa/main/formatquery.c
+++ b/src/mesa/main/formatquery.c
@@ -33,6 +33,7 @@
 #include "texobj.h"
 #include "get.h"
 #include "genmipmap.h"
+#include "shaderimage.h"
 
 static bool
 _is_renderable(struct gl_context *ctx, GLenum internalformat)
@@ -605,6 +606,9 @@ _mesa_query_internal_format_default(struct gl_context *ctx, GLenum target,
    case GL_GEOMETRY_TEXTURE:
    case GL_FRAGMENT_TEXTURE:
    case GL_COMPUTE_TEXTURE:
+   case GL_SHADER_IMAGE_LOAD:
+   case GL_SHADER_IMAGE_STORE:
+   case GL_SHADER_IMAGE_ATOMIC:
       params[0] = GL_FULL_SUPPORT;
       break;
 
@@ -1163,15 +1167,30 @@ _mesa_GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname,
       break;
 
    case GL_SHADER_IMAGE_LOAD:
-      /* @TODO */
-      break;
-
    case GL_SHADER_IMAGE_STORE:
-      /* @TODO */
+      if (!ctx->Extensions.ARB_shader_image_load_store)
+         goto end;
+
+      /* We call to _mesa_is_shader_image_format_supported
+       * using "internalformat" as parameter, because the
+       * the ARB_internalformat_query2 spec says:
+       * "In this case the <internalformat> is the value of the <format>
+       * parameter that is passed to BindImageTexture."
+       */
+      if (target == GL_RENDERBUFFER ||
+          !_mesa_is_shader_image_format_supported(ctx, internalformat))
+         goto end;
+
+      ctx->Driver.QueryInternalFormat(ctx, target, internalformat, pname,
+                                      buffer);
       break;
 
    case GL_SHADER_IMAGE_ATOMIC:
-      /* @TODO */
+      if (!ctx->Extensions.ARB_shader_image_load_store)
+         goto end;
+
+      ctx->Driver.QueryInternalFormat(ctx, target, internalformat, pname,
+                                      buffer);
       break;
 
    case GL_IMAGE_TEXEL_SIZE:
-- 
2.5.3



More information about the mesa-dev mailing list