diff options
author | Ben Skeggs <skeggsb@gmail.com> | 2008-06-23 00:01:17 +1000 |
---|---|---|
committer | Ben Skeggs <skeggsb@gmail.com> | 2008-06-23 00:01:17 +1000 |
commit | aa3ab377e6e2e5811cdd704d87c3e24acb5eff72 (patch) | |
tree | ab8a443a58a58a6b88f35d4b5730ed1292e44d26 /src/mesa/state_tracker/st_framebuffer.c | |
parent | 8c26a521ee80f5d8a1d0aabd0910233aad400322 (diff) | |
parent | e2c3f06e9649b5b87fc9adbca7d1f07841bba895 (diff) |
Merge remote branch 'upstream/gallium-0.1' into nouveau-gallium-0.1
Conflicts:
configs/default
Diffstat (limited to 'src/mesa/state_tracker/st_framebuffer.c')
-rw-r--r-- | src/mesa/state_tracker/st_framebuffer.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/mesa/state_tracker/st_framebuffer.c b/src/mesa/state_tracker/st_framebuffer.c index 47466c97d8..7e6db46757 100644 --- a/src/mesa/state_tracker/st_framebuffer.c +++ b/src/mesa/state_tracker/st_framebuffer.c @@ -32,11 +32,13 @@ #include "main/framebuffer.h" #include "main/matrix.h" #include "main/renderbuffer.h" +#include "main/scissor.h" #include "st_public.h" #include "st_context.h" #include "st_cb_fbo.h" #include "pipe/p_defines.h" #include "pipe/p_context.h" +#include "pipe/p_inlines.h" struct st_framebuffer * @@ -154,6 +156,61 @@ void st_unreference_framebuffer( struct st_framebuffer **stfb ) /** + * Set/replace a framebuffer surface. + * The user of the state tracker can use this instead of + * st_resize_framebuffer() to provide new surfaces when a window is resized. + */ +void +st_set_framebuffer_surface(struct st_framebuffer *stfb, + uint surfIndex, struct pipe_surface *surf) +{ + static const GLuint invalid_size = 9999999; + struct st_renderbuffer *strb; + GLuint width, height, i; + + assert(surfIndex < BUFFER_COUNT); + + strb = st_renderbuffer(stfb->Base.Attachment[surfIndex].Renderbuffer); + assert(strb); + + /* replace the renderbuffer's surface/texture pointers */ + pipe_surface_reference( &strb->surface, surf ); + pipe_texture_reference( &strb->texture, surf->texture ); + + /* update renderbuffer's width/height */ + strb->Base.Width = surf->width; + strb->Base.Height = surf->height; + + /* Try to update the framebuffer's width/height from the renderbuffer + * sizes. Before we start drawing, all the rbs _should_ be the same size. + */ + width = height = invalid_size; + for (i = 0; i < BUFFER_COUNT; i++) { + if (stfb->Base.Attachment[i].Renderbuffer) { + if (width == invalid_size) { + width = stfb->Base.Attachment[i].Renderbuffer->Width; + height = stfb->Base.Attachment[i].Renderbuffer->Height; + } + else if (width != stfb->Base.Attachment[i].Renderbuffer->Width || + height != stfb->Base.Attachment[i].Renderbuffer->Height) { + /* inconsistant renderbuffer sizes, bail out */ + return; + } + } + } + + if (width != invalid_size) { + /* OK, the renderbuffers are of a consistant size, so update the + * parent framebuffer's size. + */ + stfb->Base.Width = width; + stfb->Base.Height = height; + } +} + + + +/** * Return the pipe_surface for the given renderbuffer. */ struct pipe_surface * |