Mesa (master): nv50, nvc0: reject R8G8B8A8/X8_UNORM for multisample surfaces

Christoph Bumiller chrisbmr at kemper.freedesktop.org
Tue Aug 30 04:57:15 PDT 2011


Module: Mesa
Branch: master
Commit: 9f4998639c3c47f0b7ee3e2a29b7f3609d3f7796
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=9f4998639c3c47f0b7ee3e2a29b7f3609d3f7796

Author: Christoph Bumiller <e0425955 at student.tuwien.ac.at>
Date:   Sat Aug 27 17:31:04 2011 +0200

nv50,nvc0: reject R8G8B8A8/X8_UNORM for multisample surfaces

The window system buffer will be BGRA and applications will try to
directly resolve to it, which would trigger an INVALID_OPERATION in
BlitFramebuffer if the multisample renderbuffer is RGBA.

---

 src/gallium/drivers/nv50/nv50_screen.c |    7 ++++++-
 src/gallium/drivers/nvc0/nvc0_screen.c |   12 +++++++++++-
 2 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/nv50/nv50_screen.c b/src/gallium/drivers/nv50/nv50_screen.c
index 581aad1..985a55c 100644
--- a/src/gallium/drivers/nv50/nv50_screen.c
+++ b/src/gallium/drivers/nv50/nv50_screen.c
@@ -43,7 +43,7 @@ nv50_screen_is_format_supported(struct pipe_screen *pscreen,
                                 unsigned sample_count,
                                 unsigned bindings)
 {
-   if (sample_count > 2 && sample_count != 4 && sample_count != 8)
+   if (!(0x117 & (1 << sample_count))) /* 0, 1, 2, 4 or 8 */
       return FALSE;
    if (sample_count == 8 && util_format_get_blocksizebits(format) >= 128)
       return FALSE;
@@ -56,6 +56,11 @@ nv50_screen_is_format_supported(struct pipe_screen *pscreen,
       if (nv50_screen(pscreen)->tesla->grclass < NVA0_3D)
          return FALSE;
       break;
+   case PIPE_FORMAT_R8G8B8A8_UNORM:
+   case PIPE_FORMAT_R8G8B8X8_UNORM:
+      /* HACK: GL requires equal formats for MS resolve and window is BGRA */
+      if (sample_count > 1)
+         return FALSE;
    default:
       break;
    }
diff --git a/src/gallium/drivers/nvc0/nvc0_screen.c b/src/gallium/drivers/nvc0/nvc0_screen.c
index c79256a..204887d 100644
--- a/src/gallium/drivers/nvc0/nvc0_screen.c
+++ b/src/gallium/drivers/nvc0/nvc0_screen.c
@@ -40,12 +40,22 @@ nvc0_screen_is_format_supported(struct pipe_screen *pscreen,
                                 unsigned sample_count,
                                 unsigned bindings)
 {
-   if (sample_count > 2 && sample_count != 4 && sample_count != 8)
+   if (!(0x117 & (1 << sample_count))) /* 0, 1, 2, 4 or 8 */
       return FALSE;
 
    if (!util_format_is_supported(format, bindings))
       return FALSE;
 
+   switch (format) {
+   case PIPE_FORMAT_R8G8B8A8_UNORM:
+   case PIPE_FORMAT_R8G8B8X8_UNORM:
+      /* HACK: GL requires equal formats for MS resolve and window is BGRA */
+      if (sample_count > 1)
+         return FALSE;
+   default:
+      break;
+   }
+
    /* transfers & shared are always supported */
    bindings &= ~(PIPE_BIND_TRANSFER_READ |
                  PIPE_BIND_TRANSFER_WRITE |



More information about the mesa-commit mailing list