[Mesa-dev] [PATCH 2/2] st/mesa: implement ARB_internalformat_query

Marek Olšák maraeo at gmail.com
Fri Jan 18 17:55:21 PST 2013


---
 src/mesa/state_tracker/st_cb_texture.c |    1 +
 src/mesa/state_tracker/st_extensions.c |    1 +
 src/mesa/state_tracker/st_format.c     |   46 ++++++++++++++++++++++++++++++++
 src/mesa/state_tracker/st_format.h     |    3 +++
 4 files changed, 51 insertions(+)

diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
index 7f07b74..3cea2df 100644
--- a/src/mesa/state_tracker/st_cb_texture.c
+++ b/src/mesa/state_tracker/st_cb_texture.c
@@ -1555,6 +1555,7 @@ void
 st_init_texture_functions(struct dd_function_table *functions)
 {
    functions->ChooseTextureFormat = st_ChooseTextureFormat;
+   functions->QuerySamplesForFormat = st_QuerySamplesForFormat;
    functions->TexImage = st_TexImage;
    functions->TexSubImage = _mesa_store_texsubimage;
    functions->CompressedTexSubImage = _mesa_store_compressed_texsubimage;
diff --git a/src/mesa/state_tracker/st_extensions.c b/src/mesa/state_tracker/st_extensions.c
index aa70d5e..d52c840 100644
--- a/src/mesa/state_tracker/st_extensions.c
+++ b/src/mesa/state_tracker/st_extensions.c
@@ -520,6 +520,7 @@ void st_init_extensions(struct st_context *st)
    ctx->Extensions.ARB_fragment_shader = GL_TRUE;
    ctx->Extensions.ARB_half_float_pixel = GL_TRUE;
    ctx->Extensions.ARB_half_float_vertex = GL_TRUE;
+   ctx->Extensions.ARB_internalformat_query = GL_TRUE;
    ctx->Extensions.ARB_map_buffer_range = GL_TRUE;
    ctx->Extensions.ARB_shader_objects = GL_TRUE;
    ctx->Extensions.ARB_shading_language_100 = GL_TRUE;
diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c
index af81f73..fedfd8e 100644
--- a/src/mesa/state_tracker/st_format.c
+++ b/src/mesa/state_tracker/st_format.c
@@ -1642,6 +1642,52 @@ st_ChooseTextureFormat(struct gl_context *ctx, GLenum target,
 }
 
 
+/**
+ * Called via ctx->Driver.ChooseTextureFormat().
+ */
+size_t
+st_QuerySamplesForFormat(struct gl_context *ctx, GLenum internalFormat,
+                         int samples[16])
+{
+   struct pipe_screen *screen = st_context(ctx)->pipe->screen;
+   enum pipe_format format;
+   unsigned i, num_sample_counts;
+
+   /* If multisampling isn't supported, we should return 1.
+    * Otherwise, we should only return values > 1.
+    */
+   samples[0] = 1;
+
+   if (ctx->Const.MaxSamples <= 1) {
+      return 1;
+   }
+
+   /* Use Const.MaxSamples to make sure this returns a format
+    * with MSAA support. Requesting a format with one sample might return
+    * a different format.
+    */
+   format = st_choose_format(screen, internalFormat, GL_NONE, GL_NONE,
+                             PIPE_TEXTURE_2D, ctx->Const.MaxSamples,
+                             PIPE_BIND_RENDER_TARGET);
+   if (format == PIPE_FORMAT_NONE) {
+      return 1;
+   }
+
+   /* Set samples counts in descending order. */
+   samples[0] = ctx->Const.MaxSamples;
+   num_sample_counts = 1;
+
+   for (i = ctx->Const.MaxSamples-1; i > 1; i--) {
+      if (screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, i,
+                                      PIPE_BIND_RENDER_TARGET)) {
+         samples[num_sample_counts++] = i;
+      }
+   }
+
+   return num_sample_counts;
+}
+
+
 GLboolean
 st_sampler_compat_formats(enum pipe_format format1, enum pipe_format format2)
 {
diff --git a/src/mesa/state_tracker/st_format.h b/src/mesa/state_tracker/st_format.h
index 39397b1..cb6e5bc 100644
--- a/src/mesa/state_tracker/st_format.h
+++ b/src/mesa/state_tracker/st_format.h
@@ -67,6 +67,9 @@ st_ChooseTextureFormat(struct gl_context * ctx, GLenum target,
                        GLint internalFormat,
                        GLenum format, GLenum type);
 
+size_t
+st_QuerySamplesForFormat(struct gl_context *ctx, GLenum internalFormat,
+                         int samples[16]);
 
 /* can we use a sampler view to translate these formats
    only used to make TFP so far */
-- 
1.7.10.4



More information about the mesa-dev mailing list