[Mesa-dev] [RFC 31/63] mesa/formatquery: support for IMAGE_FORMAT_COMPATIBILITY_TYPE

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


From: Alejandro PiƱeiro <apinheiro at igalia.com>

>From arb_internalformat_query2 spec:

 "IMAGE_FORMAT_COMPATIBILITY_TYPE: The matching criteria use for the
  resource when used as an image textures is returned in
  <params>. This is equivalent to calling GetTexParameter with <value>
  set to IMAGE_FORMAT_COMPATIBILITY_TYPE."

Current implementation of GetTexParameter for this case returns a
field of a texture object, so the support of this pname was
implemented creating a temporal texture object and returning that
value.

It is worth to mention that right now that field is not reassigned
after initialization. So it is somehow hardcoded. An alternative
option would be return that value. That doesn't seems really scalable
though.
---
 src/mesa/main/formatquery.c | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/mesa/main/formatquery.c b/src/mesa/main/formatquery.c
index 16d5499..ee4405b 100644
--- a/src/mesa/main/formatquery.c
+++ b/src/mesa/main/formatquery.c
@@ -30,6 +30,7 @@
 #include "formatquery.h"
 #include "teximage.h"
 #include "texparam.h"
+#include "texobj.h"
 
 static bool
 _is_renderable(struct gl_context *ctx, GLenum internalformat)
@@ -944,9 +945,26 @@ _mesa_GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname,
       /* @TODO */
       break;
 
-   case GL_IMAGE_FORMAT_COMPATIBILITY_TYPE:
-      /* @TODO */
+   case GL_IMAGE_FORMAT_COMPATIBILITY_TYPE: {
+      if (!ctx->Extensions.ARB_shader_image_load_store)
+         goto end;
+
+      if (!_mesa_legal_get_tex_level_parameter_target(ctx, target, true))
+         goto end;
+
+      /* From spec: "Equivalent to calling GetTexParameter with <value> set
+       * to IMAGE_FORMAT_COMPATIBILITY_TYPE."
+       *
+       * GetTexParameter just returns
+       * tex_obj->ImageFormatCompatibilityType. We create a fake tex_obj
+       * just with the purpose of getting the value.
+       */
+      struct gl_texture_object *tex_obj = _mesa_new_texture_object(ctx, 0, target);
+      buffer[0] = tex_obj->ImageFormatCompatibilityType;
+      _mesa_delete_texture_object(ctx, tex_obj);
+
       break;
+   }
 
    case GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST:
       /* @TODO */
-- 
2.5.3



More information about the mesa-dev mailing list