X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fstate_tracker%2Fst_atom_framebuffer.c;h=c752640f49d9a5da1a6daeeea84c2882fd8c2001;hb=ae6eba3e32a142665d2ae6e15c9122d3201c0b5d;hp=e18c0f6e0a19b42c083600d7f2d1e1b1ac71a255;hpb=0d4a05445c6b47b93269a3829afbe509ffec4817;p=mesa.git diff --git a/src/mesa/state_tracker/st_atom_framebuffer.c b/src/mesa/state_tracker/st_atom_framebuffer.c index e18c0f6e0a1..c752640f49d 100644 --- a/src/mesa/state_tracker/st_atom_framebuffer.c +++ b/src/mesa/state_tracker/st_atom_framebuffer.c @@ -33,49 +33,54 @@ #include "st_context.h" #include "st_atom.h" +#include "st_cb_bitmap.h" #include "st_cb_fbo.h" -#include "st_public.h" #include "st_texture.h" #include "pipe/p_context.h" -#include "pipe/p_inlines.h" #include "cso_cache/cso_context.h" -#include "util/u_rect.h" - +#include "util/u_math.h" +#include "util/u_inlines.h" +#include "util/u_format.h" /** * When doing GL render to texture, we have to be sure that finalize_texture() - * didn't yank out the pipe_texture that we earlier created a surface for. + * didn't yank out the pipe_resource that we earlier created a surface for. * Check for that here and create a new surface if needed. */ static void update_renderbuffer_surface(struct st_context *st, struct st_renderbuffer *strb) { - struct pipe_screen *screen = st->pipe->screen; - struct pipe_texture *texture = strb->rtt->pt; + struct pipe_context *pipe = st->pipe; + struct pipe_resource *resource = strb->rtt ? strb->rtt->pt : strb->texture; int rtt_width = strb->Base.Width; int rtt_height = strb->Base.Height; + enum pipe_format format = st->ctx->Color.sRGBEnabled ? resource->format : util_format_linear(resource->format); if (!strb->surface || - strb->surface->texture != texture || + strb->surface->texture->nr_samples != strb->Base.NumSamples || + strb->surface->format != format || + strb->surface->texture != resource || strb->surface->width != rtt_width || strb->surface->height != rtt_height) { GLuint level; /* find matching mipmap level size */ - for (level = 0; level <= texture->last_level; level++) { - if (texture->width[level] == rtt_width && - texture->height[level] == rtt_height) { + for (level = 0; level <= resource->last_level; level++) { + if (u_minify(resource->width0, level) == rtt_width && + u_minify(resource->height0, level) == rtt_height) { + struct pipe_surface surf_tmpl; + memset(&surf_tmpl, 0, sizeof(surf_tmpl)); + surf_tmpl.format = format; + surf_tmpl.u.tex.level = level; + surf_tmpl.u.tex.first_layer = strb->rtt_face + strb->rtt_slice; + surf_tmpl.u.tex.last_layer = strb->rtt_face + strb->rtt_slice; pipe_surface_reference(&strb->surface, NULL); - strb->surface = screen->get_tex_surface(screen, - texture, - strb->rtt_face, - level, - strb->rtt_slice, - PIPE_BUFFER_USAGE_GPU_READ | - PIPE_BUFFER_USAGE_GPU_WRITE); + strb->surface = pipe->create_surface(pipe, + resource, + &surf_tmpl); #if 0 printf("-- alloc new surface %d x %d into tex %p\n", strb->surface->width, strb->surface->height, @@ -99,6 +104,9 @@ update_framebuffer_state( struct st_context *st ) struct st_renderbuffer *strb; GLuint i; + st_flush_bitmap_cache(st); + + st->state.fb_orientation = st_fb_orientation(fb); framebuffer->width = fb->Width; framebuffer->height = fb->Height; @@ -113,7 +121,8 @@ update_framebuffer_state( struct st_context *st ) if (strb) { /*printf("--------- framebuffer surface rtt %p\n", strb->rtt);*/ - if (strb->rtt) { + if (strb->rtt || + (strb->texture && util_format_is_srgb(strb->texture->format))) { /* rendering to a GL texture, may have to update surface */ update_renderbuffer_surface(st, strb); } @@ -135,7 +144,6 @@ update_framebuffer_state( struct st_context *st ) */ strb = st_renderbuffer(fb->Attachment[BUFFER_DEPTH].Renderbuffer); if (strb) { - strb = st_renderbuffer(strb->Base.Wrapped); if (strb->rtt) { /* rendering to a GL texture, may have to update surface */ update_renderbuffer_surface(st, strb); @@ -145,7 +153,6 @@ update_framebuffer_state( struct st_context *st ) else { strb = st_renderbuffer(fb->Attachment[BUFFER_STENCIL].Renderbuffer); if (strb) { - strb = st_renderbuffer(strb->Base.Wrapped); assert(strb->surface); pipe_surface_reference(&framebuffer->zsbuf, strb->surface); } @@ -153,31 +160,17 @@ update_framebuffer_state( struct st_context *st ) pipe_surface_reference(&framebuffer->zsbuf, NULL); } - cso_set_framebuffer(st->cso_context, framebuffer); - - if (fb->_ColorDrawBufferIndexes[0] == BUFFER_FRONT_LEFT) { - if (st->frontbuffer_status == FRONT_STATUS_COPY_OF_BACK) { - /* copy back color buffer to front color buffer */ - struct st_framebuffer *stfb = (struct st_framebuffer *) fb; - struct pipe_surface *surf_front, *surf_back; - (void) st_get_framebuffer_surface(stfb, ST_SURFACE_FRONT_LEFT, &surf_front); - (void) st_get_framebuffer_surface(stfb, ST_SURFACE_BACK_LEFT, &surf_back); - - if (st->pipe->surface_copy) { - st->pipe->surface_copy(st->pipe, - surf_front, 0, 0, /* dest */ - surf_back, 0, 0, /* src */ - fb->Width, fb->Height); - } else { - util_surface_copy(st->pipe, FALSE, - surf_front, 0, 0, - surf_back, 0, 0, - fb->Width, fb->Height); - } - } - /* we're assuming we'll really draw to the front buffer */ - st->frontbuffer_status = FRONT_STATUS_DIRTY; +#ifdef DEBUG + /* Make sure the resource binding flags were set properly */ + for (i = 0; i < framebuffer->nr_cbufs; i++) { + assert(framebuffer->cbufs[i]->texture->bind & PIPE_BIND_RENDER_TARGET); + } + if (framebuffer->zsbuf) { + assert(framebuffer->zsbuf->texture->bind & PIPE_BIND_DEPTH_STENCIL); } +#endif + + cso_set_framebuffer(st->cso_context, framebuffer); }