mesa/formatquery: Added SHADER_IMAGE_{LOAD,STORE,ATOMIC} <pname> queries
authorAntia Puentes <apuentes@igalia.com>
Sat, 19 Dec 2015 18:39:53 +0000 (19:39 +0100)
committerEduardo Lima Mitev <elima@igalia.com>
Thu, 3 Mar 2016 14:14:07 +0000 (15:14 +0100)
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."

Reviewed-by: Dave Airlie <airlied@redhat.com>
src/mesa/main/formatquery.c

index b5a072ca42df9fb3399833fe4403fbb286989aeb..f487f32e7f590e4c7adc7acf2601599ed3385087 100644 (file)
@@ -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)
@@ -607,6 +608,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;
 
@@ -1190,15 +1194,30 @@ _mesa_GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname,
       break;
 
    case GL_SHADER_IMAGE_LOAD:
-      /* @TODO */
-      break;
-
    case GL_SHADER_IMAGE_STORE:
-      /* @TODO */
+      if (!_mesa_has_ARB_shader_image_load_store(ctx))
+         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 (!_mesa_has_ARB_shader_image_load_store(ctx))
+         goto end;
+
+      ctx->Driver.QueryInternalFormat(ctx, target, internalformat, pname,
+                                      buffer);
       break;
 
    case GL_IMAGE_TEXEL_SIZE: