st_atom_framebuffer.c revision 54507125e735ffa595e252282eaabf38095c21e1
1fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian/**************************************************************************
2fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian *
3fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian * All Rights Reserved.
5fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian *
6fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian * Permission is hereby granted, free of charge, to any person obtaining a
7fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian * copy of this software and associated documentation files (the
8fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian * "Software"), to deal in the Software without restriction, including
9fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian * without limitation the rights to use, copy, modify, merge, publish,
10fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian * distribute, sub license, and/or sell copies of the Software, and to
11fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian * permit persons to whom the Software is furnished to do so, subject to
12fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian * the following conditions:
13fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian *
14fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian * The above copyright notice and this permission notice (including the
15fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian * next paragraph) shall be included in all copies or substantial portions
16fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian * of the Software.
17fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian *
18fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian *
26fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian **************************************************************************/
27fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian
28fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian /*
29fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian  * Authors:
30fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian  *   Keith Whitwell <keith@tungstengraphics.com>
31fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian  *   Brian Paul
32fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian  */
33fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian
34fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian#include "st_context.h"
35fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian#include "st_atom.h"
36f5713c7d2e7ba8e1170fd9b1dd95379662ab6117Brian#include "st_cb_fbo.h"
37fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian#include "pipe/p_context.h"
387d95efde0a0e13e13c59444703bc47eb13926385Brian#include "cso_cache/cso_context.h"
39fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian
40fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian
41fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian/**
42fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian * Update framebuffer state (color, depth, stencil, etc. buffers)
43fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian * XXX someday: separate draw/read buffers.
44fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian */
45fe1f94f26c5cb43934513a38f60bf00aa542e64cBrianstatic void
46fe1f94f26c5cb43934513a38f60bf00aa542e64cBrianupdate_framebuffer_state( struct st_context *st )
47fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian{
4811c34dc644fe58b8178ab9142929a6685e3c0848Brian Paul   struct pipe_framebuffer_state *framebuffer = &st->state.framebuffer;
49fd3876e9e3fb17df61dbf45d400796d682a8fbe0Brian   struct gl_framebuffer *fb = st->ctx->DrawBuffer;
50f5713c7d2e7ba8e1170fd9b1dd95379662ab6117Brian   struct st_renderbuffer *strb;
51e4b3c13d7a7dbd716bdf4b4d2dda8c6e579bd2d1Brian   GLuint i, j;
52fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian
5311c34dc644fe58b8178ab9142929a6685e3c0848Brian Paul   memset(framebuffer, 0, sizeof(*framebuffer));
544576d754c98e3fb5d413e294d48fb70a893defcfBrian
553a4ece89a799a7c699be229a6d965d4820af0196Brian   framebuffer->width = fb->Width;
563a4ece89a799a7c699be229a6d965d4820af0196Brian   framebuffer->height = fb->Height;
573a4ece89a799a7c699be229a6d965d4820af0196Brian
58fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian   /* Examine Mesa's ctx->DrawBuffer->_ColorDrawBuffers state
59fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian    * to determine which surfaces to draw to
60fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian    */
61e4b3c13d7a7dbd716bdf4b4d2dda8c6e579bd2d1Brian   framebuffer->num_cbufs = 0;
62e4b3c13d7a7dbd716bdf4b4d2dda8c6e579bd2d1Brian   for (j = 0; j < MAX_DRAW_BUFFERS; j++) {
63e4b3c13d7a7dbd716bdf4b4d2dda8c6e579bd2d1Brian      for (i = 0; i < fb->_NumColorDrawBuffers[j]; i++) {
64e4b3c13d7a7dbd716bdf4b4d2dda8c6e579bd2d1Brian         strb = st_renderbuffer(fb->_ColorDrawBuffers[j][i]);
65e4b3c13d7a7dbd716bdf4b4d2dda8c6e579bd2d1Brian         assert(strb->surface);
66e4b3c13d7a7dbd716bdf4b4d2dda8c6e579bd2d1Brian         framebuffer->cbufs[framebuffer->num_cbufs] = strb->surface;
67e4b3c13d7a7dbd716bdf4b4d2dda8c6e579bd2d1Brian         framebuffer->num_cbufs++;
68e4b3c13d7a7dbd716bdf4b4d2dda8c6e579bd2d1Brian      }
69fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian   }
70fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian
71fd3876e9e3fb17df61dbf45d400796d682a8fbe0Brian   strb = st_renderbuffer(fb->Attachment[BUFFER_DEPTH].Renderbuffer);
72f5713c7d2e7ba8e1170fd9b1dd95379662ab6117Brian   if (strb) {
73f5713c7d2e7ba8e1170fd9b1dd95379662ab6117Brian      strb = st_renderbuffer(strb->Base.Wrapped);
74f5713c7d2e7ba8e1170fd9b1dd95379662ab6117Brian      assert(strb->surface);
7511c34dc644fe58b8178ab9142929a6685e3c0848Brian Paul      framebuffer->zsbuf = strb->surface;
76ecfa794037e8be351ecfec0229d1e3b1677ae369Brian   }
778de2331e432e2ea6f978acb6c80666da99c6c4a1Brian   else {
788de2331e432e2ea6f978acb6c80666da99c6c4a1Brian      strb = st_renderbuffer(fb->Attachment[BUFFER_STENCIL].Renderbuffer);
798de2331e432e2ea6f978acb6c80666da99c6c4a1Brian      if (strb) {
808de2331e432e2ea6f978acb6c80666da99c6c4a1Brian         strb = st_renderbuffer(strb->Base.Wrapped);
818de2331e432e2ea6f978acb6c80666da99c6c4a1Brian         assert(strb->surface);
8211c34dc644fe58b8178ab9142929a6685e3c0848Brian Paul         framebuffer->zsbuf = strb->surface;
838de2331e432e2ea6f978acb6c80666da99c6c4a1Brian      }
84ecfa794037e8be351ecfec0229d1e3b1677ae369Brian   }
85ecfa794037e8be351ecfec0229d1e3b1677ae369Brian
8611c34dc644fe58b8178ab9142929a6685e3c0848Brian Paul   cso_set_framebuffer(st->cso_context, framebuffer);
87311e40268414649f047ee177ba22a17a2d437843Brian Paul
88311e40268414649f047ee177ba22a17a2d437843Brian Paul   if (fb->_ColorDrawBufferMask[0] & BUFFER_BIT_FRONT_LEFT) {
89311e40268414649f047ee177ba22a17a2d437843Brian Paul      if (st->frontbuffer_status == FRONT_STATUS_COPY_OF_BACK) {
90311e40268414649f047ee177ba22a17a2d437843Brian Paul         /* XXX copy back buf to front? */
91311e40268414649f047ee177ba22a17a2d437843Brian Paul      }
92311e40268414649f047ee177ba22a17a2d437843Brian Paul      /* we're assuming we'll really draw to the front buffer */
93311e40268414649f047ee177ba22a17a2d437843Brian Paul      st->frontbuffer_status = FRONT_STATUS_DIRTY;
94311e40268414649f047ee177ba22a17a2d437843Brian Paul   }
95fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian}
96fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian
97fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian
98fe1f94f26c5cb43934513a38f60bf00aa542e64cBrianconst struct st_tracked_state st_update_framebuffer = {
9954507125e735ffa595e252282eaabf38095c21e1Alan Hourihane   "st_update_framebuffer",				/* name */
10054507125e735ffa595e252282eaabf38095c21e1Alan Hourihane   {							/* dirty */
10154507125e735ffa595e252282eaabf38095c21e1Alan Hourihane      _NEW_BUFFERS,					/* mesa */
10254507125e735ffa595e252282eaabf38095c21e1Alan Hourihane      0,						/* st */
103fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian   },
10454507125e735ffa595e252282eaabf38095c21e1Alan Hourihane   update_framebuffer_state				/* update */
105fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian};
106fe1f94f26c5cb43934513a38f60bf00aa542e64cBrian
107