st/mesa: fix binding flags in st_ChooseTextureFormat()
authorBrian Paul <brianp@vmware.com>
Thu, 22 Apr 2010 20:34:22 +0000 (14:34 -0600)
committerBrian Paul <brianp@vmware.com>
Thu, 22 Apr 2010 20:37:50 +0000 (14:37 -0600)
See comment for more info.

src/mesa/state_tracker/st_format.c

index 875b65c5b52ec66dc828a587a6dd45d62868547b..3e767507eefb953fb9062a53aad8be264ddd7305 100644 (file)
@@ -36,6 +36,7 @@
 #include "main/context.h"
 #include "main/texstore.h"
 #include "main/enums.h"
+#include "main/image.h"
 #include "main/macros.h"
 
 #include "pipe/p_context.h"
@@ -672,12 +673,24 @@ st_ChooseTextureFormat(GLcontext *ctx, GLint internalFormat,
                        GLenum format, GLenum type)
 {
    enum pipe_format pFormat;
+   uint usage = PIPE_BIND_SAMPLER_VIEW;
 
    (void) format;
    (void) type;
 
+   /* GL textures may wind up being render targets, but we don't know
+    * that in advance.  Specify potential render target flags now.
+    * An alternative would be to destroy and re-create a texture when
+    * we first start rendering to it.
+    */
+   if (_mesa_is_depth_format(internalFormat) ||
+       _mesa_is_depthstencil_format(internalFormat))
+      usage |= PIPE_BIND_DEPTH_STENCIL;
+   else 
+      usage |= PIPE_BIND_RENDER_TARGET;
+
    pFormat = st_choose_format(ctx->st->pipe->screen, internalFormat,
-                              PIPE_TEXTURE_2D, PIPE_BIND_SAMPLER_VIEW);
+                              PIPE_TEXTURE_2D, usage);
    if (pFormat == PIPE_FORMAT_NONE)
       return MESA_FORMAT_NONE;