st/mesa: call is_format_supported() for compressed formats
[mesa.git] / src / mesa / state_tracker / st_cb_fbo.c
index 728285f14d219bcf55739005d415453122fde606..e5c956d561d10f5de5203c86a78eef1df149ee3a 100644 (file)
@@ -64,7 +64,8 @@ st_renderbuffer_alloc_storage(GLcontext * ctx, struct gl_renderbuffer *rb,
                               GLenum internalFormat,
                               GLuint width, GLuint height)
 {
-   struct pipe_screen *screen = ctx->st->pipe->screen;
+   struct st_context *st = st_context(ctx);
+   struct pipe_screen *screen = st->pipe->screen;
    struct st_renderbuffer *strb = st_renderbuffer(rb);
    enum pipe_format format;
 
@@ -230,8 +231,10 @@ st_new_renderbuffer_fb(enum pipe_format format, int samples, boolean sw)
    strb->software = sw;
    
    switch (format) {
+   case PIPE_FORMAT_R8G8B8A8_UNORM:
    case PIPE_FORMAT_B8G8R8A8_UNORM:
    case PIPE_FORMAT_A8R8G8B8_UNORM:
+   case PIPE_FORMAT_R8G8B8X8_UNORM:
    case PIPE_FORMAT_B8G8R8X8_UNORM:
    case PIPE_FORMAT_X8R8G8B8_UNORM:
    case PIPE_FORMAT_B5G5R5A1_UNORM:
@@ -310,10 +313,12 @@ st_render_texture(GLcontext *ctx,
                   struct gl_framebuffer *fb,
                   struct gl_renderbuffer_attachment *att)
 {
-   struct pipe_screen *screen = ctx->st->pipe->screen;
+   struct st_context *st = st_context(ctx);
+   struct pipe_context *pipe = st->pipe;
+   struct pipe_screen *screen = pipe->screen;
    struct st_renderbuffer *strb;
    struct gl_renderbuffer *rb;
-   struct pipe_resource *pt = st_get_texobj_texture(att->Texture);
+   struct pipe_resource *pt = st_get_texobj_resource(att->Texture);
    struct st_texture_object *stObj;
    const struct gl_texture_image *texImage;
    GLint pt_level;
@@ -360,7 +365,8 @@ st_render_texture(GLcontext *ctx,
 
    pipe_surface_reference(&strb->surface, NULL);
 
-   pipe_sampler_view_reference(&strb->sampler_view, st_get_texture_sampler_view(stObj));
+   pipe_sampler_view_reference(&strb->sampler_view,
+                               st_get_texture_sampler_view(stObj, pipe));
 
    assert(strb->rtt_level <= strb->texture->last_level);
 
@@ -398,12 +404,13 @@ static void
 st_finish_render_texture(GLcontext *ctx,
                          struct gl_renderbuffer_attachment *att)
 {
+   struct st_context *st = st_context(ctx);
    struct st_renderbuffer *strb = st_renderbuffer(att->Renderbuffer);
 
    if (!strb)
       return;
 
-   st_flush( ctx->st, PIPE_FLUSH_RENDER_CACHE, NULL );
+   st_flush(st, PIPE_FLUSH_RENDER_CACHE, NULL);
 
    strb->rtt = NULL;
 
@@ -417,23 +424,19 @@ st_finish_render_texture(GLcontext *ctx,
 
 
 /**
- * Validate a renderbuffer attachment for a particular usage.
+ * Validate a renderbuffer attachment for a particular set of bindings.
  */
-
 static GLboolean
 st_validate_attachment(struct pipe_screen *screen,
                       const struct gl_renderbuffer_attachment *att,
-                      GLuint usage)
+                      unsigned bindings)
 {
-   const struct st_texture_object *stObj =
-      st_texture_object(att->Texture);
+   const struct st_texture_object *stObj = st_texture_object(att->Texture);
 
-   /**
-    * Only validate texture attachments for now, since
+   /* Only validate texture attachments for now, since
     * st_renderbuffer_alloc_storage makes sure that
     * the format is supported.
     */
-
    if (att->Type != GL_TEXTURE)
       return GL_TRUE;
 
@@ -441,10 +444,10 @@ st_validate_attachment(struct pipe_screen *screen,
       return GL_FALSE;
 
    return screen->is_format_supported(screen, stObj->pt->format,
-                                     PIPE_TEXTURE_2D,
-                                     usage, 0);
+                                     PIPE_TEXTURE_2D, bindings, 0);
 }
 
+
 /**
  * Check that the framebuffer configuration is valid in terms of what
  * the driver can support.
@@ -454,7 +457,8 @@ st_validate_attachment(struct pipe_screen *screen,
 static void
 st_validate_framebuffer(GLcontext *ctx, struct gl_framebuffer *fb)
 {
-   struct pipe_screen *screen = ctx->st->pipe->screen;
+   struct st_context *st = st_context(ctx);
+   struct pipe_screen *screen = st->pipe->screen;
    const struct gl_renderbuffer *depthRb =
       fb->Attachment[BUFFER_DEPTH].Renderbuffer;
    const struct gl_renderbuffer *stencilRb =
@@ -495,6 +499,7 @@ st_validate_framebuffer(GLcontext *ctx, struct gl_framebuffer *fb)
 static void
 st_DrawBuffers(GLcontext *ctx, GLsizei count, const GLenum *buffers)
 {
+   struct st_context *st = st_context(ctx);
    GLframebuffer *fb = ctx->DrawBuffer;
    GLuint i;
 
@@ -504,7 +509,7 @@ st_DrawBuffers(GLcontext *ctx, GLsizei count, const GLenum *buffers)
    /* add the renderbuffers on demand */
    for (i = 0; i < fb->_NumColorDrawBuffers; i++) {
       gl_buffer_index idx = fb->_ColorDrawBufferIndexes[i];
-      st_manager_add_color_renderbuffer(ctx->st, fb, idx);
+      st_manager_add_color_renderbuffer(st, fb, idx);
    }
 }
 
@@ -515,12 +520,13 @@ st_DrawBuffers(GLcontext *ctx, GLsizei count, const GLenum *buffers)
 static void
 st_ReadBuffer(GLcontext *ctx, GLenum buffer)
 {
+   struct st_context *st = st_context(ctx);
    GLframebuffer *fb = ctx->ReadBuffer;
 
    (void) buffer;
 
    /* add the renderbuffer on demand */
-   st_manager_add_color_renderbuffer(ctx->st, fb, fb->_ColorReadBufferIndex);
+   st_manager_add_color_renderbuffer(st, fb, fb->_ColorReadBufferIndex);
 }
 
 
@@ -542,7 +548,7 @@ void st_init_fbo_functions(struct dd_function_table *functions)
 }
 
 struct pipe_sampler_view *
-st_renderbuffer_get_sampler_view(struct st_renderbuffer *rb,
+st_get_renderbuffer_sampler_view(struct st_renderbuffer *rb,
                                  struct pipe_context *pipe)
 {
    if (!rb->sampler_view) {