fb->_AllColorBuffersFixedPoint = !visual->floatMode;
fb->_HasSNormOrFloatColorBuffer = visual->floatMode;
fb->_HasAttachments = true;
+ fb->FlipY = true;
+
+ fb->SampleLocationTable = NULL;
+ fb->ProgrammableSampleLocations = 0;
+ fb->SampleLocationPixelGrid = 0;
compute_depth_max(fb);
}
fb->_ColorDrawBufferIndexes[0] = BUFFER_COLOR0;
fb->ColorReadBuffer = GL_COLOR_ATTACHMENT0_EXT;
fb->_ColorReadBufferIndex = BUFFER_COLOR0;
+ fb->SampleLocationTable = NULL;
+ fb->ProgrammableSampleLocations = 0;
+ fb->SampleLocationPixelGrid = 0;
fb->Delete = _mesa_destroy_framebuffer;
simple_mtx_init(&fb->Mutex, mtx_plain);
}
void
_mesa_free_framebuffer_data(struct gl_framebuffer *fb)
{
- GLuint i;
-
assert(fb);
assert(fb->RefCount == 0);
simple_mtx_destroy(&fb->Mutex);
- for (i = 0; i < BUFFER_COUNT; i++) {
+ for (unsigned i = 0; i < BUFFER_COUNT; i++) {
struct gl_renderbuffer_attachment *att = &fb->Attachment[i];
if (att->Renderbuffer) {
_mesa_reference_renderbuffer(&att->Renderbuffer, NULL);
assert(!att->Texture);
att->Type = GL_NONE;
}
+
+ free(fb->SampleLocationTable);
+ fb->SampleLocationTable = NULL;
}
_mesa_resize_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb,
GLuint width, GLuint height)
{
- GLuint i;
-
/* XXX I think we could check if the size is not changing
* and return early.
*/
/* Can only resize win-sys framebuffer objects */
assert(_mesa_is_winsys_fbo(fb));
- for (i = 0; i < BUFFER_COUNT; i++) {
+ for (unsigned i = 0; i < BUFFER_COUNT; i++) {
struct gl_renderbuffer_attachment *att = &fb->Attachment[i];
if (att->Type == GL_RENDERBUFFER_EXT && att->Renderbuffer) {
struct gl_renderbuffer *rb = att->Renderbuffer;
_mesa_update_framebuffer_visual(struct gl_context *ctx,
struct gl_framebuffer *fb)
{
- GLuint i;
-
memset(&fb->Visual, 0, sizeof(fb->Visual));
- fb->Visual.rgbMode = GL_TRUE; /* assume this */
/* find first RGB renderbuffer */
- for (i = 0; i < BUFFER_COUNT; i++) {
+ for (unsigned i = 0; i < BUFFER_COUNT; i++) {
if (fb->Attachment[i].Renderbuffer) {
const struct gl_renderbuffer *rb = fb->Attachment[i].Renderbuffer;
const GLenum baseFormat = _mesa_get_format_base_format(rb->Format);
fb->Visual.alphaBits = _mesa_get_format_bits(fmt, GL_ALPHA_BITS);
fb->Visual.rgbBits = fb->Visual.redBits
+ fb->Visual.greenBits + fb->Visual.blueBits;
- if (_mesa_get_format_color_encoding(fmt) == GL_SRGB)
- fb->Visual.sRGBCapable = ctx->Extensions.EXT_framebuffer_sRGB;
+ if (_mesa_is_format_srgb(fmt))
+ fb->Visual.sRGBCapable = ctx->Extensions.EXT_sRGB;
break;
}
}
}
fb->Visual.floatMode = GL_FALSE;
- for (i = 0; i < BUFFER_COUNT; i++) {
+ for (unsigned i = 0; i < BUFFER_COUNT; i++) {
if (fb->Attachment[i].Renderbuffer) {
const struct gl_renderbuffer *rb = fb->Attachment[i].Renderbuffer;
const mesa_format fmt = rb->Format;
const struct gl_renderbuffer *rb =
fb->Attachment[BUFFER_DEPTH].Renderbuffer;
const mesa_format fmt = rb->Format;
- fb->Visual.haveDepthBuffer = GL_TRUE;
fb->Visual.depthBits = _mesa_get_format_bits(fmt, GL_DEPTH_BITS);
}
const struct gl_renderbuffer *rb =
fb->Attachment[BUFFER_STENCIL].Renderbuffer;
const mesa_format fmt = rb->Format;
- fb->Visual.haveStencilBuffer = GL_TRUE;
fb->Visual.stencilBits = _mesa_get_format_bits(fmt, GL_STENCIL_BITS);
}
const struct gl_renderbuffer *rb =
fb->Attachment[BUFFER_ACCUM].Renderbuffer;
const mesa_format fmt = rb->Format;
- fb->Visual.haveAccumBuffer = GL_TRUE;
fb->Visual.accumRedBits = _mesa_get_format_bits(fmt, GL_RED_BITS);
fb->Visual.accumGreenBits = _mesa_get_format_bits(fmt, GL_GREEN_BITS);
fb->Visual.accumBlueBits = _mesa_get_format_bits(fmt, GL_BLUE_BITS);
* writing colors.
*/
static void
-update_color_draw_buffers(struct gl_context *ctx, struct gl_framebuffer *fb)
+update_color_draw_buffers(struct gl_framebuffer *fb)
{
GLuint output;
* Unlike the DrawBuffer, we can only read from one (or zero) color buffers.
*/
static void
-update_color_read_buffer(struct gl_context *ctx, struct gl_framebuffer *fb)
+update_color_read_buffer(struct gl_framebuffer *fb)
{
- (void) ctx;
if (fb->_ColorReadBufferIndex == BUFFER_NONE ||
fb->DeletePending ||
fb->Width == 0 ||
_mesa_drawbuffers(ctx, fb, ctx->Const.MaxDrawBuffers,
ctx->Color.DrawBuffer, NULL);
}
+
+ /* Call device driver function if fb is the bound draw buffer. */
+ if (fb == ctx->DrawBuffer) {
+ if (ctx->Driver.DrawBufferAllocate)
+ ctx->Driver.DrawBufferAllocate(ctx);
+ }
}
else {
/* This is a user-created framebuffer.
* read-state if this FB is bound as ctx->DrawBuffer), but no
* harm.
*/
- update_color_draw_buffers(ctx, fb);
- update_color_read_buffer(ctx, fb);
+ update_color_draw_buffers(fb);
+ update_color_read_buffer(fb);
compute_depth_max(fb);
}
}
else {
const mesa_format format = fb->_ColorReadBuffer->Format;
- const GLenum data_type = _mesa_get_format_datatype(format);
- if (format == MESA_FORMAT_B8G8R8A8_UNORM)
+ switch (format) {
+ case MESA_FORMAT_RGBA_UINT8:
+ return GL_RGBA_INTEGER;
+ case MESA_FORMAT_B8G8R8A8_UNORM:
return GL_BGRA;
- else if (format == MESA_FORMAT_B5G6R5_UNORM)
+ case MESA_FORMAT_B5G6R5_UNORM:
+ case MESA_FORMAT_R11G11B10_FLOAT:
return GL_RGB;
- else if (format == MESA_FORMAT_R_UNORM8)
+ case MESA_FORMAT_RG_FLOAT32:
+ case MESA_FORMAT_RG_FLOAT16:
+ case MESA_FORMAT_RG_UNORM8:
+ return GL_RG;
+ case MESA_FORMAT_RG_SINT32:
+ case MESA_FORMAT_RG_UINT32:
+ case MESA_FORMAT_RG_SINT16:
+ case MESA_FORMAT_RG_UINT16:
+ case MESA_FORMAT_RG_SINT8:
+ case MESA_FORMAT_RG_UINT8:
+ return GL_RG_INTEGER;
+ case MESA_FORMAT_R_FLOAT32:
+ case MESA_FORMAT_R_FLOAT16:
+ case MESA_FORMAT_R_UNORM16:
+ case MESA_FORMAT_R_UNORM8:
+ case MESA_FORMAT_R_SNORM16:
+ case MESA_FORMAT_R_SNORM8:
return GL_RED;
+ case MESA_FORMAT_R_SINT32:
+ case MESA_FORMAT_R_UINT32:
+ case MESA_FORMAT_R_SINT16:
+ case MESA_FORMAT_R_UINT16:
+ case MESA_FORMAT_R_SINT8:
+ case MESA_FORMAT_R_UINT8:
+ return GL_RED_INTEGER;
+ default:
+ break;
+ }
- switch (data_type) {
- case GL_UNSIGNED_INT:
- case GL_INT:
+ if (_mesa_is_format_integer(format))
return GL_RGBA_INTEGER;
- default:
+ else
return GL_RGBA;
- }
}
}
return GL_NONE;
}
else {
- const GLenum format = fb->_ColorReadBuffer->Format;
- const GLenum data_type = _mesa_get_format_datatype(format);
-
- if (format == MESA_FORMAT_B5G6R5_UNORM)
- return GL_UNSIGNED_SHORT_5_6_5;
-
- switch (data_type) {
- case GL_SIGNED_NORMALIZED:
- return GL_BYTE;
- case GL_UNSIGNED_INT:
- case GL_INT:
- case GL_FLOAT:
- return data_type;
- case GL_UNSIGNED_NORMALIZED:
- default:
- return GL_UNSIGNED_BYTE;
- }
+ const mesa_format format = fb->_ColorReadBuffer->Format;
+ GLenum data_type;
+ GLuint comps;
+
+ _mesa_uncompressed_format_to_type_and_comps(format, &data_type, &comps);
+
+ return data_type;
}
}
void
_mesa_print_framebuffer(const struct gl_framebuffer *fb)
{
- GLuint i;
-
fprintf(stderr, "Mesa Framebuffer %u at %p\n", fb->Name, (void *) fb);
fprintf(stderr, " Size: %u x %u Status: %s\n", fb->Width, fb->Height,
_mesa_enum_to_string(fb->_Status));
fprintf(stderr, " Attachments:\n");
- for (i = 0; i < BUFFER_COUNT; i++) {
+ for (unsigned i = 0; i < BUFFER_COUNT; i++) {
const struct gl_renderbuffer_attachment *att = &fb->Attachment[i];
if (att->Type == GL_TEXTURE) {
const struct gl_texture_image *texImage = att->Renderbuffer->TexImage;