1de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu/*
2de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu * Mesa 3-D graphics library
3de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu * Version:  7.9
4de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu *
5de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu * Copyright (C) 2010 LunarG Inc.
6de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu *
7de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a
8de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu * copy of this software and associated documentation files (the "Software"),
9de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu * to deal in the Software without restriction, including without limitation
10de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu * and/or sell copies of the Software, and to permit persons to whom the
12de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu * Software is furnished to do so, subject to the following conditions:
13de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu *
14de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu * The above copyright notice and this permission notice shall be included
15de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu * in all copies or substantial portions of the Software.
16de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu *
17ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23ba81b0743efd978509b1931d7b4b93f37e8aeb5eChia-I Wu * DEALINGS IN THE SOFTWARE.
24de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu *
25de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu * Authors:
26de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu *    Chia-I Wu <olv@lunarg.com>
27de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu */
28de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
29de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu#include "main/mtypes.h"
30de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu#include "main/context.h"
31edc09358f72cd48cb2315daf23c82e7646aeaea3Vinson Lee#include "main/mfeatures.h"
32de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu#include "main/texobj.h"
33de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu#include "main/teximage.h"
34de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu#include "main/texstate.h"
35de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu#include "main/framebuffer.h"
3641c095bf31cedf4f463e315e8dbad8a007985464Chia-I Wu#include "main/fbobject.h"
37de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu#include "main/renderbuffer.h"
384531356817ec8383ac35932903773de67af92e37Chia-I Wu#include "main/version.h"
39de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu#include "st_texture.h"
40de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
41de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu#include "st_context.h"
42de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu#include "st_format.h"
43de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu#include "st_cb_fbo.h"
4457c654324f5577d30c5239cd0c2c3eb7ad474143Chia-I Wu#include "st_cb_flush.h"
45de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu#include "st_manager.h"
46de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
478cfaab59e0875bff92179aacfffd690c805906efBrian Paul#include "state_tracker/st_gl_api.h"
488cfaab59e0875bff92179aacfffd690c805906efBrian Paul
498cfaab59e0875bff92179aacfffd690c805906efBrian Paul#include "pipe/p_context.h"
508cfaab59e0875bff92179aacfffd690c805906efBrian Paul#include "pipe/p_screen.h"
518cfaab59e0875bff92179aacfffd690c805906efBrian Paul#include "util/u_format.h"
528cfaab59e0875bff92179aacfffd690c805906efBrian Paul#include "util/u_pointer.h"
538cfaab59e0875bff92179aacfffd690c805906efBrian Paul#include "util/u_inlines.h"
548cfaab59e0875bff92179aacfffd690c805906efBrian Paul#include "util/u_atomic.h"
558cfaab59e0875bff92179aacfffd690c805906efBrian Paul#include "util/u_surface.h"
568cfaab59e0875bff92179aacfffd690c805906efBrian Paul
57de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu/**
5831aca27c08d6a385c595d34fe4ee06390bf5b0e8Kristian Høgsberg * Cast wrapper to convert a struct gl_framebuffer to an st_framebuffer.
5931aca27c08d6a385c595d34fe4ee06390bf5b0e8Kristian Høgsberg * Return NULL if the struct gl_framebuffer is a user-created framebuffer.
60af0b0e1172a14ca215777f6ef6569d1433f45af2Brian Paul * We'll only return non-null for window system framebuffers.
614a30330b26b543dfa864a05a1e8072f764369a25Chia-I Wu * Note that this function may fail.
624a30330b26b543dfa864a05a1e8072f764369a25Chia-I Wu */
634a30330b26b543dfa864a05a1e8072f764369a25Chia-I Wustatic INLINE struct st_framebuffer *
6431aca27c08d6a385c595d34fe4ee06390bf5b0e8Kristian Høgsbergst_ws_framebuffer(struct gl_framebuffer *fb)
654a30330b26b543dfa864a05a1e8072f764369a25Chia-I Wu{
664a30330b26b543dfa864a05a1e8072f764369a25Chia-I Wu   /* FBO cannot be casted.  See st_new_framebuffer */
67284ad9c3b29a6d6f0bade050ea9e949d67967983Paul Berry   if (fb && _mesa_is_winsys_fbo(fb))
68284ad9c3b29a6d6f0bade050ea9e949d67967983Paul Berry      return (struct st_framebuffer *) fb;
69284ad9c3b29a6d6f0bade050ea9e949d67967983Paul Berry   return NULL;
704a30330b26b543dfa864a05a1e8072f764369a25Chia-I Wu}
714a30330b26b543dfa864a05a1e8072f764369a25Chia-I Wu
724a30330b26b543dfa864a05a1e8072f764369a25Chia-I Wu/**
73de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu * Map an attachment to a buffer index.
74de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu */
75de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wustatic INLINE gl_buffer_index
76de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wuattachment_to_buffer_index(enum st_attachment_type statt)
77de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu{
78de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   gl_buffer_index index;
79de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
80de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   switch (statt) {
81de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   case ST_ATTACHMENT_FRONT_LEFT:
82de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      index = BUFFER_FRONT_LEFT;
83de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      break;
84de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   case ST_ATTACHMENT_BACK_LEFT:
85de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      index = BUFFER_BACK_LEFT;
86de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      break;
87de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   case ST_ATTACHMENT_FRONT_RIGHT:
88de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      index = BUFFER_FRONT_RIGHT;
89de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      break;
90de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   case ST_ATTACHMENT_BACK_RIGHT:
91de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      index = BUFFER_BACK_RIGHT;
92de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      break;
93de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   case ST_ATTACHMENT_DEPTH_STENCIL:
94de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      index = BUFFER_DEPTH;
95de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      break;
96de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   case ST_ATTACHMENT_ACCUM:
97de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      index = BUFFER_ACCUM;
98de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      break;
99de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   case ST_ATTACHMENT_SAMPLE:
100de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   default:
101de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      index = BUFFER_COUNT;
102de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      break;
103de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   }
104de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
105de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   return index;
106de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu}
107de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
108de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu/**
109de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu * Map a buffer index to an attachment.
110de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu */
111de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wustatic INLINE enum st_attachment_type
112de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wubuffer_index_to_attachment(gl_buffer_index index)
113de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu{
114de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   enum st_attachment_type statt;
115de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
116de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   switch (index) {
117de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   case BUFFER_FRONT_LEFT:
118de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      statt = ST_ATTACHMENT_FRONT_LEFT;
119de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      break;
120de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   case BUFFER_BACK_LEFT:
121de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      statt = ST_ATTACHMENT_BACK_LEFT;
122de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      break;
123de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   case BUFFER_FRONT_RIGHT:
124de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      statt = ST_ATTACHMENT_FRONT_RIGHT;
125de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      break;
126de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   case BUFFER_BACK_RIGHT:
127de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      statt = ST_ATTACHMENT_BACK_RIGHT;
128de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      break;
129de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   case BUFFER_DEPTH:
130de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      statt = ST_ATTACHMENT_DEPTH_STENCIL;
131de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      break;
132de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   case BUFFER_ACCUM:
133de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      statt = ST_ATTACHMENT_ACCUM;
134de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      break;
135de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   default:
136de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      statt = ST_ATTACHMENT_INVALID;
137de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      break;
138de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   }
139de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
140de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   return statt;
141de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu}
142de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
143de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu/**
144ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom * Make sure a context picks up the latest cached state of the
145ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom * drawables it binds to.
146ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom */
147ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstromstatic void
148ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstromst_context_validate(struct st_context *st,
149ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom                    struct st_framebuffer *stdraw,
150ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom                    struct st_framebuffer *stread)
151ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom{
152ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom    if (stdraw && stdraw->stamp != st->draw_stamp) {
153ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom       st->dirty.st |= ST_NEW_FRAMEBUFFER;
154ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom       _mesa_resize_framebuffer(st->ctx, &stdraw->Base,
155ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom                                stdraw->Base.Width,
156ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom                                stdraw->Base.Height);
157ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom       st->draw_stamp = stdraw->stamp;
158ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom    }
159ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom
160ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom    if (stread && stread->stamp != st->read_stamp) {
161ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom       if (stread != stdraw) {
162ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom          st->dirty.st |= ST_NEW_FRAMEBUFFER;
163ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom          _mesa_resize_framebuffer(st->ctx, &stread->Base,
164ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom                                   stread->Base.Width,
165ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom                                   stread->Base.Height);
166ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom       }
167ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom       st->read_stamp = stread->stamp;
168ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom    }
169ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom}
170ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom
171ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom/**
172a66d0081044bfcbfbe72ecbc27692387e4716e5cChia-I Wu * Validate a framebuffer to make sure up-to-date pipe_textures are used.
173ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom * The context we need to pass in is s dummy context needed only to be
174ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom * able to get a pipe context to create pipe surfaces, and to have a
175ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom * context to call _mesa_resize_framebuffer():
176ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom * (That should probably be rethought, since those surfaces become
177ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom * drawable state, not context state, and can be freed by another pipe
178ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom * context).
179de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu */
180de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wustatic void
181ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstromst_framebuffer_validate(struct st_framebuffer *stfb,
182ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom                        struct st_context *st)
183de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu{
184287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   struct pipe_resource *textures[ST_ATTACHMENT_COUNT];
185de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   uint width, height;
186de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   unsigned i;
187de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   boolean changed = FALSE;
188ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom   int32_t new_stamp = p_atomic_read(&stfb->iface->stamp);
189de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
190ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom   if (stfb->iface_stamp == new_stamp)
191de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      return;
192de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
193de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   /* validate the fb */
194ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom   do {
195ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom      if (!stfb->iface->validate(stfb->iface, stfb->statts,
196ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom				 stfb->num_statts, textures))
197ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom	 return;
198ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom
199ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom      stfb->iface_stamp = new_stamp;
200ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom      new_stamp = p_atomic_read(&stfb->iface->stamp);
201ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom   } while(stfb->iface_stamp != new_stamp);
202de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
203de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   width = stfb->Base.Width;
204de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   height = stfb->Base.Height;
205de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
206de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   for (i = 0; i < stfb->num_statts; i++) {
207de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      struct st_renderbuffer *strb;
2084c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      struct pipe_surface *ps, surf_tmpl;
209de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      gl_buffer_index idx;
210de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
211de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      if (!textures[i])
212de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         continue;
213de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
214de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      idx = attachment_to_buffer_index(stfb->statts[i]);
215de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      if (idx >= BUFFER_COUNT) {
216287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell         pipe_resource_reference(&textures[i], NULL);
217de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         continue;
218de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      }
219de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
220de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      strb = st_renderbuffer(stfb->Base.Attachment[idx].Renderbuffer);
221de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      assert(strb);
222de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      if (strb->texture == textures[i]) {
223287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell         pipe_resource_reference(&textures[i], NULL);
224de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         continue;
225de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      }
226de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
2274c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger      u_surface_default_template(&surf_tmpl, textures[i],
2284c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                                 PIPE_BIND_RENDER_TARGET);
229ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom      ps = st->pipe->create_surface(st->pipe, textures[i], &surf_tmpl);
230de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      if (ps) {
231de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         pipe_surface_reference(&strb->surface, ps);
232287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell         pipe_resource_reference(&strb->texture, ps->texture);
233de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         /* ownership transfered */
234de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         pipe_surface_reference(&ps, NULL);
235de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
236de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         changed = TRUE;
237de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
238de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         strb->Base.Width = strb->surface->width;
239de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         strb->Base.Height = strb->surface->height;
240de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
241de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         width = strb->Base.Width;
242de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         height = strb->Base.Height;
243de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      }
244de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
245287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell      pipe_resource_reference(&textures[i], NULL);
246de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   }
247de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
248de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   if (changed) {
249ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom      ++stfb->stamp;
250de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      _mesa_resize_framebuffer(st->ctx, &stfb->Base, width, height);
251de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   }
252de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu}
253de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
254de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu/**
255a66d0081044bfcbfbe72ecbc27692387e4716e5cChia-I Wu * Update the attachments to validate by looping the existing renderbuffers.
256de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu */
257de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wustatic void
258de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wust_framebuffer_update_attachments(struct st_framebuffer *stfb)
259de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu{
260de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   gl_buffer_index idx;
261de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
262de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   stfb->num_statts = 0;
263de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   for (idx = 0; idx < BUFFER_COUNT; idx++) {
264de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      struct st_renderbuffer *strb;
265de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      enum st_attachment_type statt;
266de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
267de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      strb = st_renderbuffer(stfb->Base.Attachment[idx].Renderbuffer);
268de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      if (!strb || strb->software)
269de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         continue;
270de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
271de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      statt = buffer_index_to_attachment(idx);
272de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      if (statt != ST_ATTACHMENT_INVALID &&
273de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu          st_visual_have_buffers(stfb->iface->visual, 1 << statt))
274de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         stfb->statts[stfb->num_statts++] = statt;
275de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   }
276ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom   stfb->stamp++;
277de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu}
278de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
279de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu/**
280de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu * Add a renderbuffer to the framebuffer.
281de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu */
282de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wustatic boolean
283de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wust_framebuffer_add_renderbuffer(struct st_framebuffer *stfb,
284de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu                                gl_buffer_index idx)
285de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu{
286de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   struct gl_renderbuffer *rb;
287de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   enum pipe_format format;
288de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   int samples;
289de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   boolean sw;
290de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
29141c095bf31cedf4f463e315e8dbad8a007985464Chia-I Wu   if (!stfb->iface)
29241c095bf31cedf4f463e315e8dbad8a007985464Chia-I Wu      return FALSE;
29341c095bf31cedf4f463e315e8dbad8a007985464Chia-I Wu
294de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   /* do not distinguish depth/stencil buffers */
295de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   if (idx == BUFFER_STENCIL)
296de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      idx = BUFFER_DEPTH;
297de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
298de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   switch (idx) {
299de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   case BUFFER_DEPTH:
300de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      format = stfb->iface->visual->depth_stencil_format;
301de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      sw = FALSE;
302de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      break;
303de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   case BUFFER_ACCUM:
304de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      format = stfb->iface->visual->accum_format;
305de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      sw = TRUE;
306de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      break;
307de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   default:
308de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      format = stfb->iface->visual->color_format;
309de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      sw = FALSE;
310de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      break;
311de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   }
312de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
313de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   if (format == PIPE_FORMAT_NONE)
314de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      return FALSE;
315de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
316de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   samples = stfb->iface->visual->samples;
317de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   if (!samples)
318de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      samples = st_get_msaa();
319de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
320de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   rb = st_new_renderbuffer_fb(format, samples, sw);
321de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   if (!rb)
322de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      return FALSE;
323de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
324543a29f1a16cc46c6d019d2cf2bd13a96b5a3f2fChia-I Wu   if (idx != BUFFER_DEPTH) {
325543a29f1a16cc46c6d019d2cf2bd13a96b5a3f2fChia-I Wu      _mesa_add_renderbuffer(&stfb->Base, idx, rb);
326543a29f1a16cc46c6d019d2cf2bd13a96b5a3f2fChia-I Wu   }
327543a29f1a16cc46c6d019d2cf2bd13a96b5a3f2fChia-I Wu   else {
328543a29f1a16cc46c6d019d2cf2bd13a96b5a3f2fChia-I Wu      if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 0))
329543a29f1a16cc46c6d019d2cf2bd13a96b5a3f2fChia-I Wu         _mesa_add_renderbuffer(&stfb->Base, BUFFER_DEPTH, rb);
330543a29f1a16cc46c6d019d2cf2bd13a96b5a3f2fChia-I Wu      if (util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 1))
331543a29f1a16cc46c6d019d2cf2bd13a96b5a3f2fChia-I Wu         _mesa_add_renderbuffer(&stfb->Base, BUFFER_STENCIL, rb);
332543a29f1a16cc46c6d019d2cf2bd13a96b5a3f2fChia-I Wu   }
333de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
334de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   return TRUE;
335de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu}
336de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
337de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu/**
338d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg * Intialize a struct gl_config from a visual.
339de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu */
340de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wustatic void
341de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wust_visual_to_context_mode(const struct st_visual *visual,
342d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg                          struct gl_config *mode)
343de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu{
344de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   memset(mode, 0, sizeof(*mode));
345de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
346de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   if (st_visual_have_buffers(visual, ST_ATTACHMENT_BACK_LEFT_MASK))
347de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      mode->doubleBufferMode = GL_TRUE;
348de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   if (st_visual_have_buffers(visual,
349de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu            ST_ATTACHMENT_FRONT_RIGHT_MASK | ST_ATTACHMENT_BACK_RIGHT_MASK))
350de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      mode->stereoMode = GL_TRUE;
351de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
352de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   if (visual->color_format != PIPE_FORMAT_NONE) {
353de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      mode->rgbMode = GL_TRUE;
354de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
355de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      mode->redBits =
356de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         util_format_get_component_bits(visual->color_format,
357de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu               UTIL_FORMAT_COLORSPACE_RGB, 0);
358de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      mode->greenBits =
359de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         util_format_get_component_bits(visual->color_format,
360de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu               UTIL_FORMAT_COLORSPACE_RGB, 1);
361de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      mode->blueBits =
362de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         util_format_get_component_bits(visual->color_format,
363de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu               UTIL_FORMAT_COLORSPACE_RGB, 2);
364de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      mode->alphaBits =
365de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         util_format_get_component_bits(visual->color_format,
366de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu               UTIL_FORMAT_COLORSPACE_RGB, 3);
367de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
368de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      mode->rgbBits = mode->redBits +
369de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         mode->greenBits + mode->blueBits + mode->alphaBits;
370de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   }
371de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
372de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   if (visual->depth_stencil_format != PIPE_FORMAT_NONE) {
373de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      mode->depthBits =
374de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         util_format_get_component_bits(visual->depth_stencil_format,
375de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu               UTIL_FORMAT_COLORSPACE_ZS, 0);
376de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      mode->stencilBits =
377de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         util_format_get_component_bits(visual->depth_stencil_format,
378de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu               UTIL_FORMAT_COLORSPACE_ZS, 1);
3799f0e302cc792f21c6523a85c353e053f942cd035Luca Barbieri
3809f0e302cc792f21c6523a85c353e053f942cd035Luca Barbieri      mode->haveDepthBuffer = mode->depthBits > 0;
3819f0e302cc792f21c6523a85c353e053f942cd035Luca Barbieri      mode->haveStencilBuffer = mode->stencilBits > 0;
382de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   }
383de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
384de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   if (visual->accum_format != PIPE_FORMAT_NONE) {
385de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      mode->haveAccumBuffer = GL_TRUE;
386de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
387de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      mode->accumRedBits =
388de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         util_format_get_component_bits(visual->accum_format,
389de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu               UTIL_FORMAT_COLORSPACE_RGB, 0);
390de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      mode->accumGreenBits =
391de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         util_format_get_component_bits(visual->accum_format,
392de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu               UTIL_FORMAT_COLORSPACE_RGB, 1);
393de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      mode->accumBlueBits =
394de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         util_format_get_component_bits(visual->accum_format,
395de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu               UTIL_FORMAT_COLORSPACE_RGB, 2);
396de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      mode->accumAlphaBits =
397de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         util_format_get_component_bits(visual->accum_format,
398de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu               UTIL_FORMAT_COLORSPACE_RGB, 3);
399de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   }
400de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
401de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   if (visual->samples) {
402de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      mode->sampleBuffers = 1;
403de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      mode->samples = visual->samples;
404de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   }
405de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu}
406de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
407de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu/**
408de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu * Create a framebuffer from a manager interface.
409de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu */
410de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wustatic struct st_framebuffer *
411de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wust_framebuffer_create(struct st_framebuffer_iface *stfbi)
412de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu{
413de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   struct st_framebuffer *stfb;
414d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg   struct gl_config mode;
415de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   gl_buffer_index idx;
416de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
41781affb8f4cb1a8e0304002d9cb3630ad42710b4cBenjamin Franzke   if (!stfbi)
41881affb8f4cb1a8e0304002d9cb3630ad42710b4cBenjamin Franzke      return NULL;
41981affb8f4cb1a8e0304002d9cb3630ad42710b4cBenjamin Franzke
420de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   stfb = CALLOC_STRUCT(st_framebuffer);
421de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   if (!stfb)
422de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      return NULL;
423de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
424de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   st_visual_to_context_mode(stfbi->visual, &mode);
425de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   _mesa_initialize_window_framebuffer(&stfb->Base, &mode);
426de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
427de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   stfb->iface = stfbi;
428ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom   stfb->iface_stamp = p_atomic_read(&stfbi->stamp) - 1;
429de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
430de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   /* add the color buffer */
431de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   idx = stfb->Base._ColorDrawBufferIndexes[0];
432de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   if (!st_framebuffer_add_renderbuffer(stfb, idx)) {
433de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      FREE(stfb);
434de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      return NULL;
435de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   }
436de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
437de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   st_framebuffer_add_renderbuffer(stfb, BUFFER_DEPTH);
438de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   st_framebuffer_add_renderbuffer(stfb, BUFFER_ACCUM);
439de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
440ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom   stfb->stamp = 0;
441de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   st_framebuffer_update_attachments(stfb);
442de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
443de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   stfb->Base.Initialized = GL_TRUE;
444de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
445de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   return stfb;
446de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu}
447de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
448de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu/**
449de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu * Reference a framebuffer.
450de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu */
451de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wustatic void
452de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wust_framebuffer_reference(struct st_framebuffer **ptr,
453de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu                         struct st_framebuffer *stfb)
454de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu{
45531aca27c08d6a385c595d34fe4ee06390bf5b0e8Kristian Høgsberg   struct gl_framebuffer *fb = &stfb->Base;
45631aca27c08d6a385c595d34fe4ee06390bf5b0e8Kristian Høgsberg   _mesa_reference_framebuffer((struct gl_framebuffer **) ptr, fb);
457de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu}
458de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
459de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wustatic void
460de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wust_context_flush(struct st_context_iface *stctxi, unsigned flags,
461de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu                 struct pipe_fence_handle **fence)
462de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu{
463de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   struct st_context *st = (struct st_context *) stctxi;
4647e02303497237cde958c28608477d0c355a8038bMarek Olšák   st_flush(st, fence);
4657e02303497237cde958c28608477d0c355a8038bMarek Olšák   if (flags & ST_FLUSH_FRONT)
466de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      st_manager_flush_frontbuffer(st);
467de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu}
468de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
469de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wustatic boolean
470337f6e7b0ec86c621cf1568b79804f1d78eea2f0Brian Paulst_context_teximage(struct st_context_iface *stctxi,
47109fafd3b856109ad4b24ac082ccf436022a1701cBrian Paul                    enum st_texture_type tex_type,
472de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu                    int level, enum pipe_format internal_format,
473287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                    struct pipe_resource *tex, boolean mipmap)
474de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu{
475de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   struct st_context *st = (struct st_context *) stctxi;
476f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg   struct gl_context *ctx = st->ctx;
477de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   struct gl_texture_unit *texUnit = _mesa_get_current_tex_unit(ctx);
478de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   struct gl_texture_object *texObj;
479de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   struct gl_texture_image *texImage;
480de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   struct st_texture_object *stObj;
481de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   struct st_texture_image *stImage;
482de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   GLenum internalFormat;
483719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu   GLuint width, height, depth;
48409fafd3b856109ad4b24ac082ccf436022a1701cBrian Paul   GLenum target;
485de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
48609fafd3b856109ad4b24ac082ccf436022a1701cBrian Paul   switch (tex_type) {
487de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   case ST_TEXTURE_1D:
488de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      target = GL_TEXTURE_1D;
489de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      break;
490de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   case ST_TEXTURE_2D:
491de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      target = GL_TEXTURE_2D;
492de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      break;
493de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   case ST_TEXTURE_3D:
494de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      target = GL_TEXTURE_3D;
495de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      break;
496de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   case ST_TEXTURE_RECT:
497de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      target = GL_TEXTURE_RECTANGLE_ARB;
498de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      break;
499de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   default:
500de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      return FALSE;
501de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   }
502de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
503de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   texObj = _mesa_select_tex_object(ctx, texUnit, target);
504de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   _mesa_lock_texture(ctx, texObj);
505de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
506de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   stObj = st_texture_object(texObj);
507de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   /* switch to surface based */
508de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   if (!stObj->surface_based) {
509de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      _mesa_clear_texture_object(ctx, texObj);
510de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      stObj->surface_based = GL_TRUE;
511de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   }
512de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
513de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   texImage = _mesa_get_tex_image(ctx, texObj, target, level);
514de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   stImage = st_texture_image(texImage);
515de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   if (tex) {
51683e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul      gl_format texFormat;
51783e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul
518913d7c388d1167a6cb3ccb52eb50f4c4f183b033Chia-I Wu      /*
519913d7c388d1167a6cb3ccb52eb50f4c4f183b033Chia-I Wu       * XXX When internal_format and tex->format differ, st_finalize_texture
520913d7c388d1167a6cb3ccb52eb50f4c4f183b033Chia-I Wu       * needs to allocate a new texture with internal_format and copy the
521913d7c388d1167a6cb3ccb52eb50f4c4f183b033Chia-I Wu       * texture here into the new one.  It will result in surface_copy being
522913d7c388d1167a6cb3ccb52eb50f4c4f183b033Chia-I Wu       * called on surfaces whose formats differ.
523913d7c388d1167a6cb3ccb52eb50f4c4f183b033Chia-I Wu       *
524913d7c388d1167a6cb3ccb52eb50f4c4f183b033Chia-I Wu       * To avoid that, internal_format is (wrongly) ignored here.  A sane fix
525913d7c388d1167a6cb3ccb52eb50f4c4f183b033Chia-I Wu       * is to use a sampler view.
526913d7c388d1167a6cb3ccb52eb50f4c4f183b033Chia-I Wu       */
527a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie      if (!st_sampler_compat_formats(tex->format, internal_format))
528a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie	 internal_format = tex->format;
529a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie
530a2817f6ae566b672f195cff22e14e2058d3617eaDave Airlie      if (util_format_get_component_bits(internal_format,
531719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu               UTIL_FORMAT_COLORSPACE_RGB, 3) > 0)
532719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu         internalFormat = GL_RGBA;
533719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu      else
534719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu         internalFormat = GL_RGB;
53583e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul
536d47a6ada9ca9670c60fc141fabadf40c63031c08Brian Paul      texFormat = st_ChooseTextureFormat(ctx, target, internalFormat,
537d84791a72b33f96fab54ff2399e8053c50205454Fredrik Höglund                                         GL_BGRA, GL_UNSIGNED_BYTE);
53883e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul
539892a2542a3f0753a7064c710b96f077dd5490624Brian Paul      _mesa_init_teximage_fields(ctx, texImage,
54083e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul                                 tex->width0, tex->height0, 1, 0,
54183e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul                                 internalFormat, texFormat);
542719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu
543719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu      width = tex->width0;
544719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu      height = tex->height0;
545719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu      depth = tex->depth0;
546719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu
547719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu      /* grow the image size until we hit level = 0 */
548719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu      while (level > 0) {
549719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu         if (width != 1)
550719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu            width <<= 1;
551719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu         if (height != 1)
552719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu            height <<= 1;
553719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu         if (depth != 1)
554719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu            depth <<= 1;
555719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu         level--;
556719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu      }
557de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   }
558de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   else {
559de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      _mesa_clear_texture_image(ctx, texImage);
560719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu      width = height = depth = 0;
561de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   }
562de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
563287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   pipe_resource_reference(&stImage->pt, tex);
564719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu   stObj->width0 = width;
565719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu   stObj->height0 = height;
566719f7049bb2c7f5ca886055c9cd15b2805bd8e97Chia-I Wu   stObj->depth0 = depth;
567de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
568de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   _mesa_dirty_texobj(ctx, texObj, GL_TRUE);
569de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   _mesa_unlock_texture(ctx, texObj);
570de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
571de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   return TRUE;
572de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu}
573de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
574de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wustatic void
5754f38dcd97410d0a58be19cb5c6dfbee51a3b7561Chia-I Wust_context_copy(struct st_context_iface *stctxi,
5764f38dcd97410d0a58be19cb5c6dfbee51a3b7561Chia-I Wu                struct st_context_iface *stsrci, unsigned mask)
5774f38dcd97410d0a58be19cb5c6dfbee51a3b7561Chia-I Wu{
5784f38dcd97410d0a58be19cb5c6dfbee51a3b7561Chia-I Wu   struct st_context *st = (struct st_context *) stctxi;
5794f38dcd97410d0a58be19cb5c6dfbee51a3b7561Chia-I Wu   struct st_context *src = (struct st_context *) stsrci;
5804f38dcd97410d0a58be19cb5c6dfbee51a3b7561Chia-I Wu
5814f38dcd97410d0a58be19cb5c6dfbee51a3b7561Chia-I Wu   _mesa_copy_context(src->ctx, st->ctx, mask);
5824f38dcd97410d0a58be19cb5c6dfbee51a3b7561Chia-I Wu}
5834f38dcd97410d0a58be19cb5c6dfbee51a3b7561Chia-I Wu
5844f38dcd97410d0a58be19cb5c6dfbee51a3b7561Chia-I Wustatic boolean
5854f38dcd97410d0a58be19cb5c6dfbee51a3b7561Chia-I Wust_context_share(struct st_context_iface *stctxi,
5864f38dcd97410d0a58be19cb5c6dfbee51a3b7561Chia-I Wu                 struct st_context_iface *stsrci)
5874f38dcd97410d0a58be19cb5c6dfbee51a3b7561Chia-I Wu{
5884f38dcd97410d0a58be19cb5c6dfbee51a3b7561Chia-I Wu   struct st_context *st = (struct st_context *) stctxi;
5894f38dcd97410d0a58be19cb5c6dfbee51a3b7561Chia-I Wu   struct st_context *src = (struct st_context *) stsrci;
5904f38dcd97410d0a58be19cb5c6dfbee51a3b7561Chia-I Wu
5914f38dcd97410d0a58be19cb5c6dfbee51a3b7561Chia-I Wu   return _mesa_share_state(st->ctx, src->ctx);
5924f38dcd97410d0a58be19cb5c6dfbee51a3b7561Chia-I Wu}
5934f38dcd97410d0a58be19cb5c6dfbee51a3b7561Chia-I Wu
5944f38dcd97410d0a58be19cb5c6dfbee51a3b7561Chia-I Wustatic void
595de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wust_context_destroy(struct st_context_iface *stctxi)
596de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu{
597de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   struct st_context *st = (struct st_context *) stctxi;
598de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   st_destroy_context(st);
599de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu}
600de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
601de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wustatic struct st_context_iface *
6024531356817ec8383ac35932903773de67af92e37Chia-I Wust_api_create_context(struct st_api *stapi, struct st_manager *smapi,
6034531356817ec8383ac35932903773de67af92e37Chia-I Wu                      const struct st_context_attribs *attribs,
604d18152028e1825c05c7de33acacee3336350a096Ian Romanick                      enum st_context_error *error,
6054531356817ec8383ac35932903773de67af92e37Chia-I Wu                      struct st_context_iface *shared_stctxi)
606de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu{
607de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   struct st_context *shared_ctx = (struct st_context *) shared_stctxi;
608de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   struct st_context *st;
609de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   struct pipe_context *pipe;
610d3491e775fb07f891463b2185d74bbad62f3ed24Kristian Høgsberg   struct gl_config mode;
6114531356817ec8383ac35932903773de67af92e37Chia-I Wu   gl_api api;
6124531356817ec8383ac35932903773de67af92e37Chia-I Wu
6134531356817ec8383ac35932903773de67af92e37Chia-I Wu   if (!(stapi->profile_mask & (1 << attribs->profile)))
6144531356817ec8383ac35932903773de67af92e37Chia-I Wu      return NULL;
6154531356817ec8383ac35932903773de67af92e37Chia-I Wu
6164531356817ec8383ac35932903773de67af92e37Chia-I Wu   switch (attribs->profile) {
6174531356817ec8383ac35932903773de67af92e37Chia-I Wu   case ST_PROFILE_DEFAULT:
6184531356817ec8383ac35932903773de67af92e37Chia-I Wu      api = API_OPENGL;
6194531356817ec8383ac35932903773de67af92e37Chia-I Wu      break;
6204531356817ec8383ac35932903773de67af92e37Chia-I Wu   case ST_PROFILE_OPENGL_ES1:
6214531356817ec8383ac35932903773de67af92e37Chia-I Wu      api = API_OPENGLES;
6224531356817ec8383ac35932903773de67af92e37Chia-I Wu      break;
6234531356817ec8383ac35932903773de67af92e37Chia-I Wu   case ST_PROFILE_OPENGL_ES2:
6244531356817ec8383ac35932903773de67af92e37Chia-I Wu      api = API_OPENGLES2;
6254531356817ec8383ac35932903773de67af92e37Chia-I Wu      break;
6264531356817ec8383ac35932903773de67af92e37Chia-I Wu   case ST_PROFILE_OPENGL_CORE:
6274531356817ec8383ac35932903773de67af92e37Chia-I Wu   default:
628d18152028e1825c05c7de33acacee3336350a096Ian Romanick      *error = ST_CONTEXT_ERROR_BAD_API;
6294531356817ec8383ac35932903773de67af92e37Chia-I Wu      return NULL;
6304531356817ec8383ac35932903773de67af92e37Chia-I Wu      break;
6314531356817ec8383ac35932903773de67af92e37Chia-I Wu   }
632de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
633de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   pipe = smapi->screen->context_create(smapi->screen, NULL);
634d18152028e1825c05c7de33acacee3336350a096Ian Romanick   if (!pipe) {
635d18152028e1825c05c7de33acacee3336350a096Ian Romanick      *error = ST_CONTEXT_ERROR_NO_MEMORY;
636de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      return NULL;
637d18152028e1825c05c7de33acacee3336350a096Ian Romanick   }
638de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
6394531356817ec8383ac35932903773de67af92e37Chia-I Wu   st_visual_to_context_mode(&attribs->visual, &mode);
640a6457c0692f1bc292ae4120ff5cd0bed340271b9Vadim Girlin   st = st_create_context(api, pipe, &mode, shared_ctx, &attribs->options);
641de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   if (!st) {
642d18152028e1825c05c7de33acacee3336350a096Ian Romanick      *error = ST_CONTEXT_ERROR_NO_MEMORY;
643de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      pipe->destroy(pipe);
644de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      return NULL;
645de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   }
646de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
6474531356817ec8383ac35932903773de67af92e37Chia-I Wu   /* need to perform version check */
6484531356817ec8383ac35932903773de67af92e37Chia-I Wu   if (attribs->major > 1 || attribs->minor > 0) {
6494531356817ec8383ac35932903773de67af92e37Chia-I Wu      _mesa_compute_version(st->ctx);
6504531356817ec8383ac35932903773de67af92e37Chia-I Wu
6514c7898cb13528ede00c7524849de4aeac81a6ac3Ian Romanick      /* Is the actual version less than the requested version?  Mesa can't
6524c7898cb13528ede00c7524849de4aeac81a6ac3Ian Romanick       * yet enforce the added restrictions of a forward-looking context, so
6534c7898cb13528ede00c7524849de4aeac81a6ac3Ian Romanick       * fail that too.
6544c7898cb13528ede00c7524849de4aeac81a6ac3Ian Romanick       */
6559c1b41879aab2ff7386c547a2ccce7686c018cf5Eric Anholt      if (st->ctx->Version < attribs->major * 10 + attribs->minor
6564c7898cb13528ede00c7524849de4aeac81a6ac3Ian Romanick	  || (attribs->flags & ~ST_CONTEXT_FLAG_DEBUG) != 0) {
657d18152028e1825c05c7de33acacee3336350a096Ian Romanick	 *error = ST_CONTEXT_ERROR_BAD_VERSION;
6584531356817ec8383ac35932903773de67af92e37Chia-I Wu         st_destroy_context(st);
6594531356817ec8383ac35932903773de67af92e37Chia-I Wu         return NULL;
6604531356817ec8383ac35932903773de67af92e37Chia-I Wu      }
6614531356817ec8383ac35932903773de67af92e37Chia-I Wu   }
6624531356817ec8383ac35932903773de67af92e37Chia-I Wu
663a93f9f343a64ce91587af66761399f9d4c180015Jakob Bornecrantz   st->invalidate_on_gl_viewport =
664a93f9f343a64ce91587af66761399f9d4c180015Jakob Bornecrantz      smapi->get_param(smapi, ST_MANAGER_BROKEN_INVALIDATE);
665de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
666a93f9f343a64ce91587af66761399f9d4c180015Jakob Bornecrantz   st->iface.destroy = st_context_destroy;
667de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   st->iface.flush = st_context_flush;
668de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   st->iface.teximage = st_context_teximage;
6694f38dcd97410d0a58be19cb5c6dfbee51a3b7561Chia-I Wu   st->iface.copy = st_context_copy;
6704f38dcd97410d0a58be19cb5c6dfbee51a3b7561Chia-I Wu   st->iface.share = st_context_share;
671de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   st->iface.st_context_private = (void *) smapi;
672de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
673d18152028e1825c05c7de33acacee3336350a096Ian Romanick   *error = ST_CONTEXT_SUCCESS;
674de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   return &st->iface;
675de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu}
676de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
6770c74091591a8ab2760949715b2fde41074fb9532Benjamin Franzkestatic struct st_context_iface *
6780c74091591a8ab2760949715b2fde41074fb9532Benjamin Franzkest_api_get_current(struct st_api *stapi)
6790c74091591a8ab2760949715b2fde41074fb9532Benjamin Franzke{
6800c74091591a8ab2760949715b2fde41074fb9532Benjamin Franzke   GET_CURRENT_CONTEXT(ctx);
6810c74091591a8ab2760949715b2fde41074fb9532Benjamin Franzke   struct st_context *st = (ctx) ? ctx->st : NULL;
6820c74091591a8ab2760949715b2fde41074fb9532Benjamin Franzke
6830c74091591a8ab2760949715b2fde41074fb9532Benjamin Franzke   return (st) ? &st->iface : NULL;
6840c74091591a8ab2760949715b2fde41074fb9532Benjamin Franzke}
6850c74091591a8ab2760949715b2fde41074fb9532Benjamin Franzke
6867587c140cd0c28f6c500846a7311b435443f46fdChia-I Wustatic struct st_framebuffer *
6877587c140cd0c28f6c500846a7311b435443f46fdChia-I Wust_framebuffer_reuse_or_create(struct gl_framebuffer *fb,
6887587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu                               struct st_framebuffer_iface *stfbi)
6897587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu{
6907587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu   struct st_framebuffer *cur = st_ws_framebuffer(fb), *stfb = NULL;
6917587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu
69236fb83e4a868e047521b3d5e0edc4d7a77a96aafBenjamin Franzke   /* dummy framebuffers cant be used as st_framebuffer */
69336fb83e4a868e047521b3d5e0edc4d7a77a96aafBenjamin Franzke   if (cur && &cur->Base != _mesa_get_incomplete_framebuffer() &&
69436fb83e4a868e047521b3d5e0edc4d7a77a96aafBenjamin Franzke       cur->iface == stfbi) {
6957587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu      /* reuse the current stfb */
6967587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu      st_framebuffer_reference(&stfb, cur);
6977587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu   }
6987587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu   else {
6997587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu      /* create a new one */
7007587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu      stfb = st_framebuffer_create(stfbi);
7017587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu   }
7027587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu
7037587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu   return stfb;
7047587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu}
7057587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu
706de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wustatic boolean
707de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wust_api_make_current(struct st_api *stapi, struct st_context_iface *stctxi,
708de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu                    struct st_framebuffer_iface *stdrawi,
709de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu                    struct st_framebuffer_iface *streadi)
710de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu{
711de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   struct st_context *st = (struct st_context *) stctxi;
7127587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu   struct st_framebuffer *stdraw, *stread;
713de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   boolean ret;
714de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
715de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   _glapi_check_multithread();
716de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
717de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   if (st) {
7187587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu      /* reuse or create the draw fb */
7197587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu      stdraw = st_framebuffer_reuse_or_create(st->ctx->WinSysDrawBuffer,
7207587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu                                              stdrawi);
7217587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu      if (streadi != stdrawi) {
7227587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu         /* do the same for the read fb */
7237587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu         stread = st_framebuffer_reuse_or_create(st->ctx->WinSysReadBuffer,
7247587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu                                                 streadi);
725de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      }
726de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      else {
727de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         stread = NULL;
7287587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu         /* reuse the draw fb for the read fb */
7297587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu         if (stdraw)
7307587c140cd0c28f6c500846a7311b435443f46fdChia-I Wu            st_framebuffer_reference(&stread, stdraw);
731de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      }
732de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
733de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      if (stdraw && stread) {
734de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         st_framebuffer_validate(stdraw, st);
735de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         if (stread != stdraw)
736de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu            st_framebuffer_validate(stread, st);
737de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
738de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu         ret = _mesa_make_current(st->ctx, &stdraw->Base, &stread->Base);
739ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom
740ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom         st->draw_stamp = stdraw->stamp - 1;
741ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom         st->read_stamp = stread->stamp - 1;
742ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom         st_context_validate(st, stdraw, stread);
743de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      }
744de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      else {
74581affb8f4cb1a8e0304002d9cb3630ad42710b4cBenjamin Franzke         struct gl_framebuffer *incomplete = _mesa_get_incomplete_framebuffer();
74681affb8f4cb1a8e0304002d9cb3630ad42710b4cBenjamin Franzke         ret = _mesa_make_current(st->ctx, incomplete, incomplete);
747de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      }
748de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
749de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      st_framebuffer_reference(&stdraw, NULL);
750de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      st_framebuffer_reference(&stread, NULL);
751de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   }
752de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   else {
753de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      ret = _mesa_make_current(NULL, NULL, NULL);
754de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   }
755de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
756de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   return ret;
757de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu}
758de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
759de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wustatic st_proc_t
760de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wust_api_get_proc_address(struct st_api *stapi, const char *procname)
761de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu{
762de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   return (st_proc_t) _glapi_get_proc_address(procname);
763de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu}
764de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
765de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wustatic void
766de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wust_api_destroy(struct st_api *stapi)
767de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu{
768de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu}
769de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
770de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu/**
771de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu * Flush the front buffer if the current context renders to the front buffer.
772de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu */
773de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wuvoid
774de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wust_manager_flush_frontbuffer(struct st_context *st)
775de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu{
776af0b0e1172a14ca215777f6ef6569d1433f45af2Brian Paul   struct st_framebuffer *stfb = st_ws_framebuffer(st->ctx->DrawBuffer);
777de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   struct st_renderbuffer *strb = NULL;
778de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
779de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   if (stfb)
780de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      strb = st_renderbuffer(stfb->Base.Attachment[BUFFER_FRONT_LEFT].Renderbuffer);
781de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   if (!strb)
782de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      return;
783de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
78441c095bf31cedf4f463e315e8dbad8a007985464Chia-I Wu   /* never a dummy fb */
78536fb83e4a868e047521b3d5e0edc4d7a77a96aafBenjamin Franzke   assert(&stfb->Base != _mesa_get_incomplete_framebuffer());
786de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   stfb->iface->flush_front(stfb->iface, ST_ATTACHMENT_FRONT_LEFT);
787de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu}
788de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
789de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu/**
790a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu * Return the surface of an EGLImage.
7914c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger * FIXME: I think this should operate on resources, not surfaces
792a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu */
793a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wustruct pipe_surface *
794a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wust_manager_get_egl_image_surface(struct st_context *st,
795a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu                                 void *eglimg, unsigned usage)
796a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu{
797a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu   struct st_manager *smapi =
798a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu      (struct st_manager *) st->iface.st_context_private;
799a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu   struct st_egl_image stimg;
8004c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   struct pipe_surface *ps, surf_tmpl;
801a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu
802a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu   if (!smapi || !smapi->get_egl_image)
803a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu      return NULL;
804a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu
805a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu   memset(&stimg, 0, sizeof(stimg));
806ada1d91c15e05b55829d61d04879faeea98474e9Dave Airlie   if (!smapi->get_egl_image(smapi, eglimg, &stimg))
807a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu      return NULL;
808a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu
809fc855f85d03c0e3de54443fbfecd235e0d703be9Brian Paul   u_surface_default_template(&surf_tmpl, stimg.texture, usage);
8104c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   surf_tmpl.u.tex.level = stimg.level;
8114c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   surf_tmpl.u.tex.first_layer = stimg.layer;
8124c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   surf_tmpl.u.tex.last_layer = stimg.layer;
8134c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger   ps = st->pipe->create_surface(st->pipe, stimg.texture, &surf_tmpl);
814287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell   pipe_resource_reference(&stimg.texture, NULL);
815a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu
816a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu   return ps;
817a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu}
818a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu
819a1aa53b2a934ca026bb115aca18a46fd920f9e8dChia-I Wu/**
820a66d0081044bfcbfbe72ecbc27692387e4716e5cChia-I Wu * Re-validate the framebuffers.
821de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu */
822de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wuvoid
823de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wust_manager_validate_framebuffers(struct st_context *st)
824de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu{
825af0b0e1172a14ca215777f6ef6569d1433f45af2Brian Paul   struct st_framebuffer *stdraw = st_ws_framebuffer(st->ctx->DrawBuffer);
826af0b0e1172a14ca215777f6ef6569d1433f45af2Brian Paul   struct st_framebuffer *stread = st_ws_framebuffer(st->ctx->ReadBuffer);
827de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
828de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   if (stdraw)
829de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      st_framebuffer_validate(stdraw, st);
830de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   if (stread && stread != stdraw)
831de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      st_framebuffer_validate(stread, st);
832ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom
833ac8fdbc1c723afb19eeaba5457ba78d0bf33b8d4Thomas Hellstrom   st_context_validate(st, stdraw, stread);
834de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu}
835de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
836de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu/**
837a66d0081044bfcbfbe72ecbc27692387e4716e5cChia-I Wu * Add a color renderbuffer on demand.
838de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu */
839de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wuboolean
840337f6e7b0ec86c621cf1568b79804f1d78eea2f0Brian Paulst_manager_add_color_renderbuffer(struct st_context *st,
841337f6e7b0ec86c621cf1568b79804f1d78eea2f0Brian Paul                                  struct gl_framebuffer *fb,
842de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu                                  gl_buffer_index idx)
843de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu{
844af0b0e1172a14ca215777f6ef6569d1433f45af2Brian Paul   struct st_framebuffer *stfb = st_ws_framebuffer(fb);
8454a30330b26b543dfa864a05a1e8072f764369a25Chia-I Wu
846da8412ec19ad00627ae9139dc02f46f344bbb6acChia-I Wu   /* FBO */
847da8412ec19ad00627ae9139dc02f46f344bbb6acChia-I Wu   if (!stfb)
8484a30330b26b543dfa864a05a1e8072f764369a25Chia-I Wu      return FALSE;
849de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
850de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   if (stfb->Base.Attachment[idx].Renderbuffer)
851de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      return TRUE;
852de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
853de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   switch (idx) {
854de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   case BUFFER_FRONT_LEFT:
855de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   case BUFFER_BACK_LEFT:
856de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   case BUFFER_FRONT_RIGHT:
857de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   case BUFFER_BACK_RIGHT:
858de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      break;
859de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   default:
860de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      return FALSE;
861de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      break;
862de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   }
863de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
864de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   if (!st_framebuffer_add_renderbuffer(stfb, idx))
865de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu      return FALSE;
866de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
867de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   st_framebuffer_update_attachments(stfb);
868a65e9706035c0e348307e76fdeeed0910ec8c68eThomas Hellstrom
869a65e9706035c0e348307e76fdeeed0910ec8c68eThomas Hellstrom   /*
870a65e9706035c0e348307e76fdeeed0910ec8c68eThomas Hellstrom    * Force a call to the state tracker manager to validate the
871a65e9706035c0e348307e76fdeeed0910ec8c68eThomas Hellstrom    * new renderbuffer. It might be that there is a window system
872a65e9706035c0e348307e76fdeeed0910ec8c68eThomas Hellstrom    * renderbuffer available.
873a65e9706035c0e348307e76fdeeed0910ec8c68eThomas Hellstrom    */
874a65e9706035c0e348307e76fdeeed0910ec8c68eThomas Hellstrom   if(stfb->iface)
875a65e9706035c0e348307e76fdeeed0910ec8c68eThomas Hellstrom      stfb->iface_stamp = p_atomic_read(&stfb->iface->stamp) - 1;
876a65e9706035c0e348307e76fdeeed0910ec8c68eThomas Hellstrom
877de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   st_invalidate_state(st->ctx, _NEW_BUFFERS);
878de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
879de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu   return TRUE;
880de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu}
881de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu
88257c654324f5577d30c5239cd0c2c3eb7ad474143Chia-I Wustatic const struct st_api st_gl_api = {
88328105471afce634df6c35ef14b198fe6e3684c00Chia-I Wu   "Mesa " MESA_VERSION_STRING,
8844531356817ec8383ac35932903773de67af92e37Chia-I Wu   ST_API_OPENGL,
8854531356817ec8383ac35932903773de67af92e37Chia-I Wu#if FEATURE_GL
8864531356817ec8383ac35932903773de67af92e37Chia-I Wu   ST_PROFILE_DEFAULT_MASK |
8874531356817ec8383ac35932903773de67af92e37Chia-I Wu#endif
8884531356817ec8383ac35932903773de67af92e37Chia-I Wu#if FEATURE_ES1
8894531356817ec8383ac35932903773de67af92e37Chia-I Wu   ST_PROFILE_OPENGL_ES1_MASK |
8904531356817ec8383ac35932903773de67af92e37Chia-I Wu#endif
8914531356817ec8383ac35932903773de67af92e37Chia-I Wu#if FEATURE_ES2
8924531356817ec8383ac35932903773de67af92e37Chia-I Wu   ST_PROFILE_OPENGL_ES2_MASK |
8934531356817ec8383ac35932903773de67af92e37Chia-I Wu#endif
8944531356817ec8383ac35932903773de67af92e37Chia-I Wu   0,
895f80c2874eca86a12517fbe2f4c15287edfb4dc89Christoph Bumiller   0,
8960c572c6828b6a338b07a6860280b3a314a81662eJakob Bornecrantz   st_api_destroy,
8970c572c6828b6a338b07a6860280b3a314a81662eJakob Bornecrantz   st_api_get_proc_address,
8980c572c6828b6a338b07a6860280b3a314a81662eJakob Bornecrantz   st_api_create_context,
8990c572c6828b6a338b07a6860280b3a314a81662eJakob Bornecrantz   st_api_make_current,
9000c572c6828b6a338b07a6860280b3a314a81662eJakob Bornecrantz   st_api_get_current,
9010c572c6828b6a338b07a6860280b3a314a81662eJakob Bornecrantz};
9020c572c6828b6a338b07a6860280b3a314a81662eJakob Bornecrantz
903de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wustruct st_api *
9040c572c6828b6a338b07a6860280b3a314a81662eJakob Bornecrantzst_gl_api_create(void)
905de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu{
90657c654324f5577d30c5239cd0c2c3eb7ad474143Chia-I Wu   return (struct st_api *) &st_gl_api;
907de8a879f5c77dbf5c31251e07b2f1b8d2635716cChia-I Wu}
908