2 #include "main/mtypes.h"
3 #include "main/formats.h"
4 #include "main/framebuffer.h"
5 #include "main/renderbuffer.h"
6 #include "main/imports.h"
7 #include "drirenderbuffer.h"
11 * This will get called when a window (gl_framebuffer) is resized (probably
12 * via driUpdateFramebufferSize(), below).
13 * Just update width, height and internal format fields for now.
14 * There's usually no memory allocation above because the present
15 * DRI drivers use statically-allocated full-screen buffers. If that's not
16 * the case for a DRI driver, a different AllocStorage method should
20 driRenderbufferStorage(GLcontext
*ctx
, struct gl_renderbuffer
*rb
,
21 GLenum internalFormat
, GLuint width
, GLuint height
)
25 rb
->InternalFormat
= internalFormat
;
31 driDeleteRenderbuffer(struct gl_renderbuffer
*rb
)
33 /* don't free rb->Data Chances are it's a memory mapped region for
41 * Allocate a new driRenderbuffer object.
42 * Individual drivers are free to implement different versions of
45 * At this time, this function can only be used for window-system
46 * renderbuffers, not user-created RBOs.
48 * \param format Either GL_RGBA, GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT24,
49 * GL_DEPTH_COMPONENT32, or GL_STENCIL_INDEX8_EXT (for now).
50 * \param addr address in main memory of the buffer. Probably a memory
52 * \param cpp chars or bytes per pixel
53 * \param offset start of renderbuffer with respect to start of framebuffer
54 * \param pitch pixels per row
57 driNewRenderbuffer(gl_format format
, GLvoid
*addr
,
58 GLint cpp
, GLint offset
, GLint pitch
,
59 __DRIdrawablePrivate
*dPriv
)
63 assert(format
== GL_RGBA
||
66 format
== GL_DEPTH_COMPONENT16
||
67 format
== GL_DEPTH_COMPONENT24
||
68 format
== GL_DEPTH_COMPONENT32
||
69 format
== GL_STENCIL_INDEX8_EXT
);
74 drb
= _mesa_calloc(sizeof(driRenderbuffer
));
76 const GLuint name
= 0;
78 _mesa_init_renderbuffer(&drb
->Base
, name
);
80 /* Make sure we're using a null-valued GetPointer routine */
81 assert(drb
->Base
.GetPointer(NULL
, &drb
->Base
, 0, 0) == NULL
);
84 case MESA_FORMAT_ARGB8888
:
87 format
= MESA_FORMAT_RGB565
;
89 drb
->Base
.DataType
= GL_UNSIGNED_BYTE
;
93 /* we always Get/Put 32-bit Z values */
94 drb
->Base
.DataType
= GL_UNSIGNED_INT
;
99 /* we always Get/Put 32-bit Z values */
100 drb
->Base
.DataType
= GL_UNSIGNED_INT
;
103 case MESA_FORMAT_Z24_S8
:
104 drb
->Base
.DataType
= GL_UNSIGNED_INT_24_8_EXT
;
107 case MESA_FORMAT_S8_Z24
:
108 drb
->Base
.DataType
= GL_UNSIGNED_INT_24_8_EXT
;
113 drb
->Base
.DataType
= GL_UNSIGNED_BYTE
;
116 _mesa_problem(NULL
, "Bad format 0x%x in driNewRenderbuffer", format
);
120 drb
->Base
.Format
= format
;
122 drb
->Base
.InternalFormat
=
123 drb
->Base
._BaseFormat
= _mesa_get_format_base_format(format
);
125 drb
->Base
.AllocStorage
= driRenderbufferStorage
;
126 drb
->Base
.Delete
= driDeleteRenderbuffer
;
128 drb
->Base
.Data
= addr
;
130 /* DRI renderbuffer-specific fields: */
132 drb
->offset
= offset
;
136 /* may be changed if page flipping is active: */
137 drb
->flippedOffset
= offset
;
138 drb
->flippedPitch
= pitch
;
139 drb
->flippedData
= addr
;
146 * Update the front and back renderbuffers' flippedPitch/Offset/Data fields.
147 * If stereo, flip both the left and right pairs.
148 * This is used when we do double buffering via page flipping.
149 * \param fb the framebuffer we're page flipping
150 * \param flipped if true, set flipped values, else set non-flipped values
153 driFlipRenderbuffers(struct gl_framebuffer
*fb
, GLboolean flipped
)
155 const GLuint count
= fb
->Visual
.stereoMode
? 2 : 1;
156 GLuint lr
; /* left or right */
158 /* we shouldn't really call this function if single-buffered, but
161 if (!fb
->Visual
.doubleBufferMode
)
164 for (lr
= 0; lr
< count
; lr
++) {
165 GLuint frontBuf
= (lr
== 0) ? BUFFER_FRONT_LEFT
: BUFFER_FRONT_RIGHT
;
166 GLuint backBuf
= (lr
== 0) ? BUFFER_BACK_LEFT
: BUFFER_BACK_RIGHT
;
167 driRenderbuffer
*front_drb
168 = (driRenderbuffer
*) fb
->Attachment
[frontBuf
].Renderbuffer
;
169 driRenderbuffer
*back_drb
170 = (driRenderbuffer
*) fb
->Attachment
[backBuf
].Renderbuffer
;
173 front_drb
->flippedOffset
= back_drb
->offset
;
174 front_drb
->flippedPitch
= back_drb
->pitch
;
175 front_drb
->flippedData
= back_drb
->Base
.Data
;
176 back_drb
->flippedOffset
= front_drb
->offset
;
177 back_drb
->flippedPitch
= front_drb
->pitch
;
178 back_drb
->flippedData
= front_drb
->Base
.Data
;
181 front_drb
->flippedOffset
= front_drb
->offset
;
182 front_drb
->flippedPitch
= front_drb
->pitch
;
183 front_drb
->flippedData
= front_drb
->Base
.Data
;
184 back_drb
->flippedOffset
= back_drb
->offset
;
185 back_drb
->flippedPitch
= back_drb
->pitch
;
186 back_drb
->flippedData
= back_drb
->Base
.Data
;
193 * Check that the gl_framebuffer associated with dPriv is the right size.
194 * Resize the gl_framebuffer if needed.
195 * It's expected that the dPriv->driverPrivate member points to a
196 * gl_framebuffer object.
199 driUpdateFramebufferSize(GLcontext
*ctx
, const __DRIdrawablePrivate
*dPriv
)
201 struct gl_framebuffer
*fb
= (struct gl_framebuffer
*) dPriv
->driverPrivate
;
202 if (fb
&& (dPriv
->w
!= fb
->Width
|| dPriv
->h
!= fb
->Height
)) {
203 ctx
->Driver
.ResizeBuffers(ctx
, fb
, dPriv
->w
, dPriv
->h
);
204 /* if the driver needs the hw lock for ResizeBuffers, the drawable
205 might have changed again by now */
206 assert(fb
->Width
== dPriv
->w
);
207 assert(fb
->Height
== dPriv
->h
);