mesa: allow internalformat_query with multisample texture targets
authorChris Forbes <chrisf@ijw.co.nz>
Sat, 16 Feb 2013 07:47:11 +0000 (20:47 +1300)
committerChris Forbes <chrisf@ijw.co.nz>
Sun, 24 Mar 2013 03:38:18 +0000 (16:38 +1300)
Now that we support ARB_texture_multisample, there are multiple targets
accepted for this query, and they may have target-dependent limits, so
pass the target to the driverfunc.

For example, the sampling hardware may not be able to do general
texelFetch() for some format/sample count combination, but the driver
may still be able to implement a reasonable resolve operation, so it can
be supported for renderbuffers.

V2: - Don't break Gallium compile.

Signed-off-by: Chris Forbes <chrisf@ijw.co.nz>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
src/mesa/drivers/dri/i965/brw_context.c
src/mesa/main/dd.h
src/mesa/main/formatquery.c
src/mesa/state_tracker/st_format.c
src/mesa/state_tracker/st_format.h

index 72378bc53bc7e694d6dea5a7c7a01e4fe71d20ba..b8e39abe4fae382fc2e0c513169b42fc4bee3424 100644 (file)
  ***************************************/
 
 static size_t
-brw_query_samples_for_format(struct gl_context *ctx, GLenum internalFormat,
-                             int samples[16])
+brw_query_samples_for_format(struct gl_context *ctx, GLenum target,
+                             GLenum internalFormat, int samples[16])
 {
    struct intel_context *intel = intel_context(ctx);
 
+   (void) target;
+
    switch (intel->gen) {
    case 7:
       samples[0] = 8;
index 4860d4d1235465b9de0a75f15e625c184d2407a7..8f3cd3d6b16b19d8b1741ab0e928ac4938dc1fbd 100644 (file)
@@ -195,9 +195,10 @@ struct dd_function_table {
                                      GLenum srcFormat, GLenum srcType );
 
    /**
-    * Determine sample counts support for a particular format
+    * Determine sample counts support for a particular target and format
     *
     * \param ctx            GL context
+    * \param target         GL target enum
     * \param internalFormat GL format enum
     * \param samples        Buffer to hold the returned sample counts.
     *                       Drivers \b must \b not return more than 16 counts.
@@ -207,6 +208,7 @@ struct dd_function_table {
     * \c internaFormat is not renderable, zero is returned.
     */
    size_t (*QuerySamplesForFormat)(struct gl_context *ctx,
+                                   GLenum target,
                                    GLenum internalFormat,
                                    int samples[16]);
 
index bd895e874811e0051b71bfa852dee47bd606b084..78c5fbe5e2b9902c0d0af0ffce3322b459d3058e 100644 (file)
@@ -59,9 +59,10 @@ _mesa_GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname,
 
    case GL_TEXTURE_2D_MULTISAMPLE:
    case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
-      /* Mesa does not currently support GL_ARB_texture_multisample, so these
-       * enums are not valid on this implementation either.
-       */
+      /* These enums are only valid if ARB_texture_multisample is supported */
+      if (_mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_texture_multisample)
+         break;
+
    default:
       _mesa_error(ctx, GL_INVALID_ENUM,
                   "glGetInternalformativ(target=%s)",
@@ -96,7 +97,8 @@ _mesa_GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname,
 
    switch (pname) {
    case GL_SAMPLES:
-      count = ctx->Driver.QuerySamplesForFormat(ctx, internalformat, buffer);
+      count = ctx->Driver.QuerySamplesForFormat(ctx, target,
+            internalformat, buffer);
       break;
    case GL_NUM_SAMPLE_COUNTS: {
       /* The driver can return 0, and we should pass that along to the
@@ -115,7 +117,7 @@ _mesa_GetInternalformativ(GLenum target, GLenum internalformat, GLenum pname,
        *          returned."
        */
       const size_t num_samples =
-         ctx->Driver.QuerySamplesForFormat(ctx, internalformat, buffer);
+         ctx->Driver.QuerySamplesForFormat(ctx, target, internalformat, buffer);
 
       /* QuerySamplesForFormat writes some stuff to buffer, so we have to
        * separately over-write it with the requested value.
index 5fd44e76d6a1249ef59502fc2b51a928a3414fb0..a15706a0322d53577cfd1deea9824e29b70f5765 100644 (file)
@@ -1769,13 +1769,15 @@ 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])
+st_QuerySamplesForFormat(struct gl_context *ctx, GLenum target,
+                         GLenum internalFormat, int samples[16])
 {
    struct st_context *st = st_context(ctx);
    enum pipe_format format;
    unsigned i, bind, num_sample_counts = 0;
 
+   (void) target;
+
    if (_mesa_is_depth_or_stencil_format(internalFormat))
       bind = PIPE_BIND_DEPTH_STENCIL;
    else
index 3db409b74e06248bf0b0bed3df1002e97cdfcf59..0a1c18d92d9e009f6baa42b7318b8bf817abd695 100644 (file)
@@ -67,8 +67,8 @@ st_ChooseTextureFormat(struct gl_context * ctx, GLenum target,
                        GLenum format, GLenum type);
 
 size_t
-st_QuerySamplesForFormat(struct gl_context *ctx, GLenum internalFormat,
-                         int samples[16]);
+st_QuerySamplesForFormat(struct gl_context *ctx, GLenum target,
+                         GLenum internalFormat, int samples[16]);
 
 /* can we use a sampler view to translate these formats
    only used to make TFP so far */