Add 'type' parameter to is_format_supported() to specify texture vs. drawing surface...
authorBrian <brian.paul@tungstengraphics.com>
Mon, 10 Dec 2007 20:48:09 +0000 (13:48 -0700)
committerBrian <brian.paul@tungstengraphics.com>
Mon, 10 Dec 2007 20:48:09 +0000 (13:48 -0700)
Additional types may be added in the future.

13 files changed:
src/mesa/drivers/dri/intel_winsys/intel_winsys_pipe.c
src/mesa/pipe/i915simple/i915_context.c
src/mesa/pipe/p_context.h
src/mesa/pipe/p_defines.h
src/mesa/pipe/softpipe/sp_context.c
src/mesa/pipe/softpipe/sp_winsys.h
src/mesa/pipe/xlib/xm_winsys.c
src/mesa/state_tracker/st_cb_drawpixels.c
src/mesa/state_tracker/st_cb_fbo.c
src/mesa/state_tracker/st_cb_fbo.h
src/mesa/state_tracker/st_format.c
src/mesa/state_tracker/st_format.h
src/mesa/state_tracker/st_framebuffer.c

index 86ea86a58fcfedb7a8dd4c4012e8978c535b97f0..9c643dd0baf4c21e656425011b2e507c1315eb19 100644 (file)
@@ -191,7 +191,7 @@ intel_i915_surface_pitch(struct pipe_winsys *winsys,
     */
 
    /* XXX is the pitch different for textures vs. drawables? */
-   if (flags & PIPE_SURFACE_FLAG_TEXTURE)  /* or PIPE_SURFACE_FLAG_RENDER? */
+   if (1/*flags & PIPE_SURFACE_FLAG_TEXTURE*/)  /* or PIPE_SURFACE_FLAG_RENDER? */
       return ((cpp * width + 63) & ~63) / cpp;
    else
       return ((cpp * width + 63) & ~63) / cpp;
index b915a677908a6246f809622b48f38fe53ba178bf..f505ff6ae6598057b8d00138351b8cd1538eaba6 100644 (file)
 
 
 /**
- * Query format support.
- * If we find texture and drawable support differs, add a selector
- * parameter or another function.
+ * Query format support for creating a texture, drawing surface, etc.
+ * \param format  the format to test
+ * \param type  one of PIPE_TEXTURE, PIPE_SURFACE, PIPE_SCREEN_SURFACE
  */
 static boolean
 i915_is_format_supported( struct pipe_context *pipe,
-                          enum pipe_format format )
+                          enum pipe_format format, uint type )
 {
-#if 0
-   /* XXX: This is broken -- rewrite if still needed. */
-   static const unsigned tex_supported[] = {
+   static const enum pipe_format tex_supported[] = {
       PIPE_FORMAT_R8G8B8A8_UNORM,
       PIPE_FORMAT_A8R8G8B8_UNORM,
       PIPE_FORMAT_R5G6B5_UNORM,
       PIPE_FORMAT_U_L8,
       PIPE_FORMAT_U_A8,
       PIPE_FORMAT_U_I8,
-      PIPE_FORMAT_U_L8_A8,
+      PIPE_FORMAT_U_A8_L8,
       PIPE_FORMAT_YCBCR,
       PIPE_FORMAT_YCBCR_REV,
       PIPE_FORMAT_S8Z24_UNORM,
+      PIPE_FORMAT_NONE  /* list terminator */
    };
-
-
-   /* Actually a lot more than this - add later:
-    */
-   static const unsigned render_supported[] = {
+   static const enum pipe_format surface_supported[] = {
       PIPE_FORMAT_A8R8G8B8_UNORM,
       PIPE_FORMAT_R5G6B5_UNORM,
-   };
-
-   /* 
-    */
-   static const unsigned z_stencil_supported[] = {
-      PIPE_FORMAT_Z16_UNORM,
-      PIPE_FORMAT_Z32_UNORM,
       PIPE_FORMAT_S8Z24_UNORM,
+      PIPE_FORMAT_R16G16B16A16_SNORM,
+      PIPE_FORMAT_NONE  /* list terminator */
+   };
+   static const enum pipe_format screen_surface_supported[] = {
+      PIPE_FORMAT_A8R8G8B8_UNORM,
+      PIPE_FORMAT_NONE  /* list terminator */
    };
+   const enum pipe_format *list;
+   uint i;
 
    switch (type) {
-   case PIPE_RENDER_FORMAT:
-      *numFormats = Elements(render_supported);
-      return render_supported;
-
-   case PIPE_TEX_FORMAT:
-      *numFormats = Elements(tex_supported);
-      return render_supported;
-
-   case PIPE_Z_STENCIL_FORMAT:
-      *numFormats = Elements(render_supported);
-      return render_supported;
-      
+   case PIPE_TEXTURE:
+      list = tex_supported;
+      break;
+   case PIPE_SURFACE:
+      list = surface_supported;
+      break;
+   case PIPE_SCREEN_SURFACE:
+      list = screen_surface_supported;
+      break;
    default:
-      *numFormats = 0;
-      return NULL;
+      assert(0);
    }
-#else
-   switch( format ) {
-   case PIPE_FORMAT_A8R8G8B8_UNORM:
-   case PIPE_FORMAT_R5G6B5_UNORM:
-   case PIPE_FORMAT_S8Z24_UNORM:
-      return TRUE;
-   default:
-      return FALSE;
-   };
-#endif
+
+   for (i = 0; list[i] != PIPE_FORMAT_NONE; i++) {
+      if (list[i] == format)
+         return TRUE;
+   }
+
+   return FALSE;
 }
 
 
index b3a2122ade9376236000bb122beec853dc7f7766..00379fbacfe64b09acb5d4bac2d743944eb9132c 100644 (file)
@@ -50,8 +50,9 @@ struct pipe_context {
    /*
     * Queries
     */
+   /** type is one of PIPE_SURFACE, PIPE_TEXTURE, etc. */
    boolean (*is_format_supported)( struct pipe_context *pipe,
-                                   enum pipe_format format );
+                                   enum pipe_format format, uint type );
 
    const char *(*get_name)( struct pipe_context *pipe );
 
index 8dce3aba904244c085be9cccb4149b5de99329e4..d3afef95b47afaf7202ca9974d05053a05efcdaf 100644 (file)
 #define PIPE_TEX_FACE_MAX     6
 
 /**
- * Surface flags
+ * Surfaces, textures, etc. (others may be added)
  */
-#define PIPE_SURFACE_FLAG_TEXTURE 0x1
-#define PIPE_SURFACE_FLAG_RENDER  0x2
+#define PIPE_TEXTURE        1
+#define PIPE_SURFACE        2  /**< user-created surfaces */
+#define PIPE_SCREEN_SURFACE 3  /**< On-screen front/back colorbuffer */
 
 
 /**
index 809b165f4504b17529dc0d3f22a7fb61d04ebdd7..8b8e04c2f9eb0c848d5209679e0a2210d40d7576 100644 (file)
 
 
 /**
- * Query format support.
- * If we find texture and drawable support differs, add a selector
- * parameter or another function.
+ * Query format support for creating a texture, drawing surface, etc.
+ * \param format  the format to test
+ * \param type  one of PIPE_TEXTURE, PIPE_SURFACE, PIPE_SCREEN_SURFACE
  */
 static boolean
 softpipe_is_format_supported( struct pipe_context *pipe,
-                              enum pipe_format format )
+                              enum pipe_format format, uint type )
 {
    struct softpipe_context *softpipe = softpipe_context( pipe );
-   /* ask winsys if the format is supported */
-   return softpipe->winsys->is_format_supported( softpipe->winsys, format );
+
+   switch (type) {
+   case PIPE_TEXTURE:
+      /* softpipe supports all texture formats */
+      return TRUE;
+   case PIPE_SURFACE:
+      /* softpipe supports all (off-screen) surface formats */
+      return TRUE;
+   case PIPE_SCREEN_SURFACE:
+      return softpipe->winsys->is_format_supported( softpipe->winsys, format );
+   default:
+      assert(0);
+      return FALSE;
+   }
 }
 
 
index 1912e59b9f4d21647a2405feefb8268c80ade398..cbf64ebb8503a4ccc1ad081a886421e5d5703f25 100644 (file)
  * 
  **************************************************************************/
 
+/* This is the interface that softpipe requires any window system
+ * hosting it to implement.  This is the only include file in softpipe
+ * which is public.
+ */
+
+
 #ifndef SP_WINSYS_H
 #define SP_WINSYS_H
 
 
-#include "pipe/p_compiler.h" // for boolean
+#include "pipe/p_compiler.h" /* for boolean */
 
 
-/* This is the interface that softpipe requires any window system
- * hosting it to implement.  This is the only include file in softpipe
- * which is public.
- */
-
 struct softpipe_winsys {
+   /** test if the given format is supported for front/back color bufs */
    boolean (*is_format_supported)( struct softpipe_winsys *sws,
-                                   uint format );
+                                   enum pipe_format format );
 
 };
 
index c347d1c2a31a626113e91d2783485caeec6bc0a5..68f9c39116d23239d6c23d24210dc9cdb235a368 100644 (file)
@@ -71,7 +71,7 @@ struct xmesa_surface
 struct xmesa_softpipe_winsys
 {
    struct softpipe_winsys spws;
-   uint pixelformat;
+   enum pipe_format pixelformat;
 };
 
 
@@ -377,35 +377,17 @@ xmesa_get_pipe_winsys(void)
 
 
 /**
+ * Called via softpipe_winsys->is_format_supported().
+ * This function is only called to test formats for front/back color surfaces.
  * The winsys being queried will have been created at glXCreateContext
  * time, with a pixel format corresponding to the context's visual.
- *
- * XXX we should pass a flag indicating if the format is going to be
- * use for a drawing surface vs. a texture.  In the later case, we
- * can support any format.
  */
 static boolean
 xmesa_is_format_supported(struct softpipe_winsys *sws,
                           enum pipe_format format)
 {
    struct xmesa_softpipe_winsys *xmws = xmesa_softpipe_winsys(sws);
-
-   if (format == xmws->pixelformat) {
-      return TRUE;
-   }
-   else {
-      /* non-color / window surface format */
-      switch (format) {
-      case PIPE_FORMAT_R16G16B16A16_SNORM:
-      case PIPE_FORMAT_S8Z24_UNORM:
-      case PIPE_FORMAT_U_S8:
-      case PIPE_FORMAT_Z16_UNORM:
-      case PIPE_FORMAT_Z32_UNORM:
-         return TRUE;
-      default:
-         return FALSE;
-      }
-   }
+   return (format == xmws->pixelformat);
 }
 
 
index c0e41dbeec5ddb13fbb0c79c3ab388f5b0095ac4..01790003532e5a68f5f1ff568248df6f71cf5d0b 100644 (file)
@@ -993,13 +993,13 @@ make_bitmap_texture(GLcontext *ctx, GLsizei width, GLsizei height,
    int row, col;
 
    /* find a texture format we know */
-   if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_I8 )) {
+   if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_I8, PIPE_TEXTURE )) {
       format = PIPE_FORMAT_U_I8;
       internal_format = GL_INTENSITY8;
       cpp = 1;
       comp = 0;
    }
-   else if (pipe->is_format_supported( pipe, PIPE_FORMAT_A8R8G8B8_UNORM )) {
+   else if (pipe->is_format_supported( pipe, PIPE_FORMAT_A8R8G8B8_UNORM, PIPE_TEXTURE )) {
       format = PIPE_FORMAT_A8R8G8B8_UNORM;
       internal_format = GL_RGBA8;
       cpp = 4;
index 36d25a576db50be3f214304eda4db4ed142390d2..6e9e7e3a24854aeec5da28ddf780edea102d8bca 100644 (file)
@@ -87,12 +87,14 @@ st_renderbuffer_alloc_storage(GLcontext * ctx, struct gl_renderbuffer *rb,
 {
    struct pipe_context *pipe = ctx->st->pipe;
    struct st_renderbuffer *strb = st_renderbuffer(rb);
+   uint type = strb->screenSurface ? PIPE_SCREEN_SURFACE : PIPE_SURFACE;
    const enum pipe_format pipeFormat
-      = st_choose_pipe_format(pipe, internalFormat, GL_NONE, GL_NONE);
+      = st_choose_pipe_format(pipe, internalFormat, GL_NONE, GL_NONE, type);
    GLuint cpp;
-   GLbitfield flags = PIPE_SURFACE_FLAG_RENDER; /* want to render to surface */
+   GLbitfield flags = 0x0; /* XXX needed? */
 
    cpp = init_renderbuffer_bits(strb, pipeFormat);
+   assert(cpp);
 
    if (strb->surface && strb->surface->format != pipeFormat) {
       /* need to change surface types, free this surface */
@@ -201,9 +203,11 @@ st_new_renderbuffer(GLcontext *ctx, GLuint name)
 /**
  * Allocate a renderbuffer for a an on-screen window (not a user-created
  * renderbuffer).  The window system code determines the internal format.
+ * \param screenSurface  indicates if the renderbuffer is a front/back color
+ *                       buffer that'll be displayed/copied to the screen
  */
 struct gl_renderbuffer *
-st_new_renderbuffer_fb(GLenum intFormat)
+st_new_renderbuffer_fb(GLenum intFormat, GLboolean screenSurface)
 {
    struct st_renderbuffer *strb;
 
@@ -216,6 +220,7 @@ st_new_renderbuffer_fb(GLenum intFormat)
    _mesa_init_renderbuffer(&strb->Base, 0);
    strb->Base.ClassID = 0x4242; /* just a unique value */
    strb->Base.InternalFormat = intFormat;
+   strb->screenSurface = screenSurface;
 
    switch (intFormat) {
    case GL_RGB5:
index 2280441db595e19044e7f914b773b1cd21398b6d..bd85bfc549f912307c5677ad12a60c64f1cfd02d 100644 (file)
@@ -39,6 +39,7 @@ struct st_renderbuffer
 {
    struct gl_renderbuffer Base;
    struct pipe_surface *surface;
+   GLboolean screenSurface;  /**< A front/back colorbuffer? */
 };
 
 
@@ -50,7 +51,7 @@ st_renderbuffer(struct gl_renderbuffer *rb)
 
 
 extern struct gl_renderbuffer *
-st_new_renderbuffer_fb(GLenum intFormat);
+st_new_renderbuffer_fb(GLenum intFormat, GLboolean screen_surface);
 
 
 extern void
index 8d39e1bec69791be0bb3b8458970461e26e79423..c292a975f388fb9527dd280878dac9b1a1817ae0 100644 (file)
@@ -276,10 +276,9 @@ st_mesa_format_to_pipe_format(GLuint mesaFormat)
  * Find an RGBA format supported by the context/winsys.
  */
 static GLuint
-default_rgba_format(
-   struct pipe_context *pipe )
+default_rgba_format(struct pipe_context *pipe, uint type)
 {
-   static const uint colorFormats[] = {
+   static const enum pipe_format colorFormats[] = {
       PIPE_FORMAT_R8G8B8A8_UNORM,
       PIPE_FORMAT_A8R8G8B8_UNORM,
       PIPE_FORMAT_B8G8R8A8_UNORM,
@@ -287,7 +286,7 @@ default_rgba_format(
    };
    uint i;
    for (i = 0; i < Elements(colorFormats); i++) {
-      if (pipe->is_format_supported( pipe, colorFormats[i] )) {
+      if (pipe->is_format_supported( pipe, colorFormats[i], type )) {
          return colorFormats[i];
       }
    }
@@ -299,10 +298,9 @@ default_rgba_format(
  * Search list of formats for first RGBA format with >8 bits/channel.
  */
 static GLuint
-default_deep_rgba_format(
-   struct pipe_context *pipe )
+default_deep_rgba_format(struct pipe_context *pipe, uint type)
 {
-   if (pipe->is_format_supported( pipe, PIPE_FORMAT_R16G16B16A16_SNORM )) {
+   if (pipe->is_format_supported(pipe, PIPE_FORMAT_R16G16B16A16_SNORM, type)) {
       return PIPE_FORMAT_R16G16B16A16_SNORM;
    }
    return PIPE_FORMAT_NONE;
@@ -313,10 +311,9 @@ default_deep_rgba_format(
  * Find an Z format supported by the context/winsys.
  */
 static GLuint
-default_depth_format(
-   struct pipe_context *pipe )
+default_depth_format(struct pipe_context *pipe, uint type)
 {
-   static const uint zFormats[] = {
+   static const enum pipe_format zFormats[] = {
       PIPE_FORMAT_Z16_UNORM,
       PIPE_FORMAT_Z32_UNORM,
       PIPE_FORMAT_S8Z24_UNORM,
@@ -324,7 +321,7 @@ default_depth_format(
    };
    uint i;
    for (i = 0; i < Elements(zFormats); i++) {
-      if (pipe->is_format_supported( pipe, zFormats[i] )) {
+      if (pipe->is_format_supported( pipe, zFormats[i], type )) {
          return zFormats[i];
       }
    }
@@ -348,67 +345,71 @@ default_depth_format(
  */
 GLuint
 st_choose_pipe_format(struct pipe_context *pipe, GLint internalFormat,
-                      GLenum format, GLenum type)
+                      GLenum format, GLenum type, uint surfType)
 {
+   assert(surfType == PIPE_TEXTURE ||
+          surfType == PIPE_SURFACE ||
+          surfType == PIPE_SCREEN_SURFACE);
+
    switch (internalFormat) {
    case 4:
    case GL_RGBA:
    case GL_COMPRESSED_RGBA:
       if (format == GL_BGRA) {
          if (type == GL_UNSIGNED_BYTE || type == GL_UNSIGNED_INT_8_8_8_8_REV) {
-            if (pipe->is_format_supported( pipe, PIPE_FORMAT_A8R8G8B8_UNORM ))
+            if (pipe->is_format_supported( pipe, PIPE_FORMAT_A8R8G8B8_UNORM, surfType ))
                return PIPE_FORMAT_A8R8G8B8_UNORM;
          }
          else if (type == GL_UNSIGNED_SHORT_4_4_4_4_REV) {
-            if (pipe->is_format_supported( pipe, PIPE_FORMAT_A4R4G4B4_UNORM ))
+            if (pipe->is_format_supported( pipe, PIPE_FORMAT_A4R4G4B4_UNORM, surfType ))
                return PIPE_FORMAT_A4R4G4B4_UNORM;
          }
          else if (type == GL_UNSIGNED_SHORT_1_5_5_5_REV) {
-            if (pipe->is_format_supported( pipe, PIPE_FORMAT_A1R5G5B5_UNORM ))
+            if (pipe->is_format_supported( pipe, PIPE_FORMAT_A1R5G5B5_UNORM, surfType ))
                return PIPE_FORMAT_A1R5G5B5_UNORM;
          }
       }
-      return default_rgba_format( pipe );
+      return default_rgba_format( pipe, surfType );
 
    case 3:
    case GL_RGB:
    case GL_COMPRESSED_RGB:
       if (format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5) {
-         if (pipe->is_format_supported( pipe, PIPE_FORMAT_R5G6B5_UNORM ))
+         if (pipe->is_format_supported( pipe, PIPE_FORMAT_R5G6B5_UNORM, surfType ))
             return PIPE_FORMAT_R5G6B5_UNORM;
       }
-      return default_rgba_format( pipe );
+      return default_rgba_format( pipe, surfType );
 
    case GL_RGBA8:
    case GL_RGB10_A2:
    case GL_RGBA12:
-      return default_rgba_format( pipe );
+      return default_rgba_format( pipe, surfType );
    case GL_RGBA16:
-      return default_deep_rgba_format( pipe );
+      return default_deep_rgba_format( pipe, surfType );
 
    case GL_RGBA4:
    case GL_RGBA2:
-      if (pipe->is_format_supported( pipe, PIPE_FORMAT_A4R4G4B4_UNORM ))
+      if (pipe->is_format_supported( pipe, PIPE_FORMAT_A4R4G4B4_UNORM, surfType ))
          return PIPE_FORMAT_A4R4G4B4_UNORM;
-      return default_rgba_format( pipe );
+      return default_rgba_format( pipe, surfType );
 
    case GL_RGB5_A1:
-      if (pipe->is_format_supported( pipe, PIPE_FORMAT_A1R5G5B5_UNORM ))
+      if (pipe->is_format_supported( pipe, PIPE_FORMAT_A1R5G5B5_UNORM, surfType ))
          return PIPE_FORMAT_A1R5G5B5_UNORM;
-      return default_rgba_format( pipe );
+      return default_rgba_format( pipe, surfType );
 
    case GL_RGB8:
    case GL_RGB10:
    case GL_RGB12:
    case GL_RGB16:
-      return default_rgba_format( pipe );
+      return default_rgba_format( pipe, surfType );
 
    case GL_RGB5:
    case GL_RGB4:
    case GL_R3_G3_B2:
-      if (pipe->is_format_supported( pipe, PIPE_FORMAT_A1R5G5B5_UNORM ))
+      if (pipe->is_format_supported( pipe, PIPE_FORMAT_A1R5G5B5_UNORM, surfType ))
          return PIPE_FORMAT_A1R5G5B5_UNORM;
-      return default_rgba_format( pipe );
+      return default_rgba_format( pipe, surfType );
 
    case GL_ALPHA:
    case GL_ALPHA4:
@@ -416,9 +417,9 @@ st_choose_pipe_format(struct pipe_context *pipe, GLint internalFormat,
    case GL_ALPHA12:
    case GL_ALPHA16:
    case GL_COMPRESSED_ALPHA:
-      if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_A8 ))
+      if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_A8, surfType ))
          return PIPE_FORMAT_U_A8;
-      return default_rgba_format( pipe );
+      return default_rgba_format( pipe, surfType );
 
    case 1:
    case GL_LUMINANCE:
@@ -427,9 +428,9 @@ st_choose_pipe_format(struct pipe_context *pipe, GLint internalFormat,
    case GL_LUMINANCE12:
    case GL_LUMINANCE16:
    case GL_COMPRESSED_LUMINANCE:
-      if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_A8 ))
+      if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_A8, surfType ))
          return PIPE_FORMAT_U_A8;
-      return default_rgba_format( pipe );
+      return default_rgba_format( pipe, surfType );
 
    case 2:
    case GL_LUMINANCE_ALPHA:
@@ -440,9 +441,9 @@ st_choose_pipe_format(struct pipe_context *pipe, GLint internalFormat,
    case GL_LUMINANCE12_ALPHA12:
    case GL_LUMINANCE16_ALPHA16:
    case GL_COMPRESSED_LUMINANCE_ALPHA:
-      if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_A8_L8 ))
+      if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_A8_L8, surfType ))
          return PIPE_FORMAT_U_A8_L8;
-      return default_rgba_format( pipe );
+      return default_rgba_format( pipe, surfType );
 
    case GL_INTENSITY:
    case GL_INTENSITY4:
@@ -450,17 +451,17 @@ st_choose_pipe_format(struct pipe_context *pipe, GLint internalFormat,
    case GL_INTENSITY12:
    case GL_INTENSITY16:
    case GL_COMPRESSED_INTENSITY:
-      if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_I8 ))
+      if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_I8, surfType ))
          return PIPE_FORMAT_U_I8;
-      return default_rgba_format( pipe );
+      return default_rgba_format( pipe, surfType );
 
    case GL_YCBCR_MESA:
       if (type == GL_UNSIGNED_SHORT_8_8_MESA || type == GL_UNSIGNED_BYTE) {
-         if (pipe->is_format_supported( pipe, PIPE_FORMAT_YCBCR ))
+         if (pipe->is_format_supported( pipe, PIPE_FORMAT_YCBCR, surfType ))
             return PIPE_FORMAT_YCBCR;
       }
       else {
-         if (pipe->is_format_supported( pipe, PIPE_FORMAT_YCBCR_REV ))
+         if (pipe->is_format_supported( pipe, PIPE_FORMAT_YCBCR_REV, surfType ))
             return PIPE_FORMAT_YCBCR_REV;
       }
       return PIPE_FORMAT_NONE;
@@ -489,40 +490,40 @@ st_choose_pipe_format(struct pipe_context *pipe, GLint internalFormat,
 #endif
 
    case GL_DEPTH_COMPONENT16:
-      if (pipe->is_format_supported( pipe, PIPE_FORMAT_Z16_UNORM ))
+      if (pipe->is_format_supported( pipe, PIPE_FORMAT_Z16_UNORM, surfType ))
          return PIPE_FORMAT_Z16_UNORM;
       /* fall-through */
    case GL_DEPTH_COMPONENT24:
-      if (pipe->is_format_supported( pipe, PIPE_FORMAT_S8Z24_UNORM ))
+      if (pipe->is_format_supported( pipe, PIPE_FORMAT_S8Z24_UNORM, surfType ))
          return PIPE_FORMAT_S8Z24_UNORM;
-      if (pipe->is_format_supported( pipe, PIPE_FORMAT_Z24S8_UNORM ))
+      if (pipe->is_format_supported( pipe, PIPE_FORMAT_Z24S8_UNORM, surfType ))
          return PIPE_FORMAT_Z24S8_UNORM;
       /* fall-through */
    case GL_DEPTH_COMPONENT32:
-      if (pipe->is_format_supported( pipe, PIPE_FORMAT_Z32_UNORM ))
+      if (pipe->is_format_supported( pipe, PIPE_FORMAT_Z32_UNORM, surfType ))
          return PIPE_FORMAT_Z32_UNORM;
       /* fall-through */
    case GL_DEPTH_COMPONENT:
-      return default_depth_format( pipe );
+      return default_depth_format( pipe, surfType );
 
    case GL_STENCIL_INDEX:
    case GL_STENCIL_INDEX1_EXT:
    case GL_STENCIL_INDEX4_EXT:
    case GL_STENCIL_INDEX8_EXT:
    case GL_STENCIL_INDEX16_EXT:
-      if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_S8 ))
+      if (pipe->is_format_supported( pipe, PIPE_FORMAT_U_S8, surfType ))
          return PIPE_FORMAT_U_S8;
-      if (pipe->is_format_supported( pipe, PIPE_FORMAT_S8Z24_UNORM ))
+      if (pipe->is_format_supported( pipe, PIPE_FORMAT_S8Z24_UNORM, surfType ))
          return PIPE_FORMAT_S8Z24_UNORM;
-      if (pipe->is_format_supported( pipe, PIPE_FORMAT_Z24S8_UNORM ))
+      if (pipe->is_format_supported( pipe, PIPE_FORMAT_Z24S8_UNORM, surfType ))
          return PIPE_FORMAT_Z24S8_UNORM;
       return PIPE_FORMAT_NONE;
 
    case GL_DEPTH_STENCIL_EXT:
    case GL_DEPTH24_STENCIL8_EXT:
-      if (pipe->is_format_supported( pipe, PIPE_FORMAT_S8Z24_UNORM ))
+      if (pipe->is_format_supported( pipe, PIPE_FORMAT_S8Z24_UNORM, surfType ))
          return PIPE_FORMAT_S8Z24_UNORM;
-      if (pipe->is_format_supported( pipe, PIPE_FORMAT_Z24S8_UNORM ))
+      if (pipe->is_format_supported( pipe, PIPE_FORMAT_Z24S8_UNORM, surfType ))
          return PIPE_FORMAT_Z24S8_UNORM;
       return PIPE_FORMAT_NONE;
 
index 6ccf5536f9dada195f71839b895cd69ff0ddfeed..ebff7c5b912121cd63802bd5e8b3528f6893c101 100644 (file)
@@ -65,7 +65,7 @@ st_mesa_format_to_pipe_format(GLuint mesaFormat);
 
 extern GLuint
 st_choose_pipe_format(struct pipe_context *pipe, GLint internalFormat,
-                      GLenum format, GLenum type);
+                      GLenum format, GLenum type, uint surfType);
 
 
 extern const struct gl_texture_format *
index 8633f431b2908dc9b4887c9b3bc18bba13d97b73..454306b8743c8c6986be7a5d22b4edd43d355792 100644 (file)
@@ -51,19 +51,21 @@ struct st_framebuffer *st_create_framebuffer( const __GLcontextModes *visual,
             /* fake frontbuffer */
             /* XXX allocation should only happen in the unusual case
                it's actually needed */
-            struct gl_renderbuffer *rb = st_new_renderbuffer_fb(rgbFormat);
+            struct gl_renderbuffer *rb
+               = st_new_renderbuffer_fb(rgbFormat, GL_TRUE);
             _mesa_add_renderbuffer(&stfb->Base, BUFFER_FRONT_LEFT, rb);
          }
 
          if (visual->doubleBufferMode) {
-            struct gl_renderbuffer *rb = st_new_renderbuffer_fb(rgbFormat);
+            struct gl_renderbuffer *rb
+               = st_new_renderbuffer_fb(rgbFormat, GL_TRUE);
             _mesa_add_renderbuffer(&stfb->Base, BUFFER_BACK_LEFT, rb);
          }
 
          if (visual->depthBits == 24 && visual->stencilBits == 8) {
             /* combined depth/stencil buffer */
             struct gl_renderbuffer *depthStencilRb
-               = st_new_renderbuffer_fb(GL_DEPTH24_STENCIL8_EXT);
+               = st_new_renderbuffer_fb(GL_DEPTH24_STENCIL8_EXT, GL_FALSE);
             /* note: bind RB to two attachment points */
             _mesa_add_renderbuffer(&stfb->Base, BUFFER_DEPTH, depthStencilRb);
             _mesa_add_renderbuffer(&stfb->Base, BUFFER_STENCIL, depthStencilRb);
@@ -74,47 +76,36 @@ struct st_framebuffer *st_create_framebuffer( const __GLcontextModes *visual,
             if (visual->depthBits == 32) {
                /* 32-bit depth buffer */
                struct gl_renderbuffer *depthRb
-                  = st_new_renderbuffer_fb(GL_DEPTH_COMPONENT32);
+                  = st_new_renderbuffer_fb(GL_DEPTH_COMPONENT32, GL_FALSE);
                _mesa_add_renderbuffer(&stfb->Base, BUFFER_DEPTH, depthRb);
             }
             else if (visual->depthBits == 24) {
                /* 24-bit depth buffer, ignore stencil bits */
                struct gl_renderbuffer *depthRb
-                  = st_new_renderbuffer_fb(GL_DEPTH24_STENCIL8_EXT);
+                  = st_new_renderbuffer_fb(GL_DEPTH24_STENCIL8_EXT, GL_FALSE);
                _mesa_add_renderbuffer(&stfb->Base, BUFFER_DEPTH, depthRb);
             }
             else if (visual->depthBits > 0) {
                /* 16-bit depth buffer */
                struct gl_renderbuffer *depthRb
-                  = st_new_renderbuffer_fb(GL_DEPTH_COMPONENT16);
+                  = st_new_renderbuffer_fb(GL_DEPTH_COMPONENT16, GL_FALSE);
                _mesa_add_renderbuffer(&stfb->Base, BUFFER_DEPTH, depthRb);
             }
 
             if (visual->stencilBits > 0) {
                /* 8-bit stencil */
                struct gl_renderbuffer *stencilRb
-                  = st_new_renderbuffer_fb(GL_STENCIL_INDEX8_EXT);
+                  = st_new_renderbuffer_fb(GL_STENCIL_INDEX8_EXT, GL_FALSE);
                _mesa_add_renderbuffer(&stfb->Base, BUFFER_STENCIL, stencilRb);
             }
          }
 
-#if 0
          if (visual->accumRedBits > 0) {
             /* 16-bit/channel accum */
             struct gl_renderbuffer *accumRb
-               = st_new_renderbuffer_fb(GL_RGBA16);
+               = st_new_renderbuffer_fb(GL_RGBA16, GL_FALSE);
             _mesa_add_renderbuffer(&stfb->Base, BUFFER_ACCUM, accumRb);
          }
-#endif
-
-         /* now add any/all software-based renderbuffers we may need */
-         _mesa_add_soft_renderbuffers(&stfb->Base,
-                                      GL_FALSE, /* never sw color */
-                                      GL_FALSE, /* never sw depth */
-                                      GL_FALSE, /* stencil */
-                                      visual->accumRedBits > 0,
-                                      GL_FALSE, /* never sw alpha */
-                                      GL_FALSE  /* never sw aux */ );
       }
 
       stfb->Base.Initialized = GL_TRUE;