svga: Don't use the new depth formats for surfaces that will never be sampled from.
authorJosé Fonseca <jfonseca@vmware.com>
Thu, 14 Apr 2011 12:28:10 +0000 (13:28 +0100)
committerBrian Paul <brianp@vmware.com>
Fri, 23 Sep 2011 13:58:46 +0000 (07:58 -0600)
Mitigates issues with hosts where support for these new depth formats is
flaky.

src/gallium/drivers/svga/svga_resource_texture.c
src/gallium/drivers/svga/svga_resource_texture.h
src/gallium/drivers/svga/svga_sampler_view.c
src/gallium/drivers/svga/svga_screen.c
src/gallium/drivers/svga/svga_surface.c

index 5fb31d2..8297f83 100644 (file)
@@ -54,7 +54,8 @@
 
 SVGA3dSurfaceFormat
 svga_translate_format(struct svga_screen *ss,
-                      enum pipe_format format)
+                      enum pipe_format format,
+                      unsigned bind)
 {
    switch(format) {
    
@@ -81,11 +82,11 @@ svga_translate_format(struct svga_screen *ss,
       return SVGA3D_Z_D32;
     */
    case PIPE_FORMAT_Z16_UNORM:
-      return ss->depth.z16;
+      return bind & PIPE_BIND_SAMPLER_VIEW ? ss->depth.z16 : SVGA3D_Z_D16;
    case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
-      return ss->depth.s8z24;
+      return bind & PIPE_BIND_SAMPLER_VIEW ? ss->depth.s8z24 : SVGA3D_Z_D24S8;
    case PIPE_FORMAT_X8Z24_UNORM:
-      return ss->depth.x8z24;
+      return bind & PIPE_BIND_SAMPLER_VIEW ? ss->depth.x8z24 : SVGA3D_Z_D24X8;
 
    case PIPE_FORMAT_A8_UNORM:
       return SVGA3D_ALPHA8;
@@ -108,7 +109,8 @@ svga_translate_format(struct svga_screen *ss,
 
 SVGA3dSurfaceFormat
 svga_translate_format_render(struct svga_screen *ss,
-                             enum pipe_format format)
+                             enum pipe_format format,
+                             unsigned bind)
 {
    switch(format) { 
    case PIPE_FORMAT_B8G8R8A8_UNORM:
@@ -121,7 +123,7 @@ svga_translate_format_render(struct svga_screen *ss,
    case PIPE_FORMAT_Z32_UNORM:
    case PIPE_FORMAT_Z16_UNORM:
    case PIPE_FORMAT_L8_UNORM:
-      return svga_translate_format(ss, format);
+      return svga_translate_format(ss, format, bind);
 
    default:
       return SVGA3D_FORMAT_INVALID;
@@ -562,7 +564,7 @@ svga_texture_create(struct pipe_screen *screen,
    
    tex->key.numMipLevels = template->last_level + 1;
    
-   tex->key.format = svga_translate_format(svgascreen, template->format);
+   tex->key.format = svga_translate_format(svgascreen, template->format, template->bind);
    if(tex->key.format == SVGA3D_FORMAT_INVALID)
       goto error2;
 
@@ -609,8 +611,8 @@ svga_texture_from_handle(struct pipe_screen *screen,
    if (!srf)
       return NULL;
 
-   if (svga_translate_format(svga_screen(screen), template->format) != format) {
-      unsigned f1 = svga_translate_format(svga_screen(screen), template->format);
+   if (svga_translate_format(svga_screen(screen), template->format, template->bind) != format) {
+      unsigned f1 = svga_translate_format(svga_screen(screen), template->format, template->bind);
       unsigned f2 = format;
 
       /* It's okay for XRGB and ARGB or depth with/out stencil to get mixed up */
index fac6a37..eb85c69 100644 (file)
@@ -127,10 +127,14 @@ svga_texture_from_handle(struct pipe_screen * screen,
 
 
 enum SVGA3dSurfaceFormat
-svga_translate_format(struct svga_screen *ss, enum pipe_format format);
+svga_translate_format(struct svga_screen *ss,
+                      enum pipe_format format,
+                      unsigned bind);
 
 enum SVGA3dSurfaceFormat
-svga_translate_format_render(struct svga_screen *ss, enum pipe_format format);
+svga_translate_format_render(struct svga_screen *ss,
+                             enum pipe_format format,
+                             unsigned bind);
 
 
 #endif /* SVGA_TEXTURE_H */
index 04aeddc..56acffe 100644 (file)
@@ -60,7 +60,7 @@ svga_get_tex_sampler_view(struct pipe_context *pipe,
    struct svga_texture *tex = svga_texture(pt); 
    struct svga_sampler_view *sv = NULL;
    SVGA3dSurfaceFlags flags = SVGA3D_SURFACE_HINT_TEXTURE;
-   SVGA3dSurfaceFormat format = svga_translate_format(ss, pt->format);
+   SVGA3dSurfaceFormat format = svga_translate_format(ss, pt->format, PIPE_BIND_SAMPLER_VIEW);
    boolean view = TRUE;
 
    assert(pt);
index e8f17ba..98479f0 100644 (file)
@@ -404,9 +404,9 @@ svga_is_format_supported( struct pipe_screen *screen,
     * out of sync:
     */
    if(tex_usage & (PIPE_BIND_RENDER_TARGET | PIPE_BIND_DEPTH_STENCIL))
-      return svga_translate_format_render(ss, format) != SVGA3D_FORMAT_INVALID;
+      return svga_translate_format_render(ss, format, tex_usage) != SVGA3D_FORMAT_INVALID;
    else
-      return svga_translate_format(ss, format) != SVGA3D_FORMAT_INVALID;
+      return svga_translate_format(ss, format, tex_usage) != SVGA3D_FORMAT_INVALID;
 }
 
 
index 1bcbd3e..0097326 100644 (file)
@@ -225,7 +225,7 @@ svga_create_surface(struct pipe_context *pipe,
 
    if (!render) {
       flags = SVGA3D_SURFACE_HINT_TEXTURE;
-      format = svga_translate_format(ss, surf_tmpl->format);
+      format = svga_translate_format(ss, surf_tmpl->format, surf_tmpl->usage);
    } else {
       if (surf_tmpl->usage & PIPE_BIND_RENDER_TARGET) {
          flags = SVGA3D_SURFACE_HINT_RENDERTARGET;
@@ -233,7 +233,7 @@ svga_create_surface(struct pipe_context *pipe,
       if (surf_tmpl->usage & PIPE_BIND_DEPTH_STENCIL) {
          flags = SVGA3D_SURFACE_HINT_DEPTHSTENCIL;
       }
-      format = svga_translate_format_render(ss, surf_tmpl->format);
+      format = svga_translate_format_render(ss, surf_tmpl->format, surf_tmpl->usage);
    }
 
    assert(format != SVGA3D_FORMAT_INVALID);
@@ -243,7 +243,7 @@ svga_create_surface(struct pipe_context *pipe,
 
    /* Currently only used for compressed textures */
    if (render && 
-       format != svga_translate_format(ss, surf_tmpl->format)) {
+       format != svga_translate_format(ss, surf_tmpl->format, surf_tmpl->usage)) {
       view = TRUE;
    }