initial support for GL_EXT_framebuffer_object
This commit is contained in:
@@ -35,6 +35,7 @@
|
|||||||
#include "context.h"
|
#include "context.h"
|
||||||
#include "depth.h"
|
#include "depth.h"
|
||||||
#include "enums.h"
|
#include "enums.h"
|
||||||
|
#include "fbobject.h"
|
||||||
#include "stencil.h"
|
#include "stencil.h"
|
||||||
#include "state.h"
|
#include "state.h"
|
||||||
#include "mtypes.h"
|
#include "mtypes.h"
|
||||||
@@ -294,16 +295,34 @@ read_buffer_enum_to_bitmask(GLenum buffer)
|
|||||||
void GLAPIENTRY
|
void GLAPIENTRY
|
||||||
_mesa_DrawBuffer( GLenum mode )
|
_mesa_DrawBuffer( GLenum mode )
|
||||||
{
|
{
|
||||||
GLenum destMask, supportedMask;
|
|
||||||
GET_CURRENT_CONTEXT(ctx);
|
GET_CURRENT_CONTEXT(ctx);
|
||||||
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); /* too complex... */
|
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); /* too complex... */
|
||||||
|
|
||||||
if (MESA_VERBOSE & VERBOSE_API)
|
if (MESA_VERBOSE & VERBOSE_API)
|
||||||
_mesa_debug(ctx, "glDrawBuffer %s\n", _mesa_lookup_enum_by_nr(mode));
|
_mesa_debug(ctx, "glDrawBuffer %s\n", _mesa_lookup_enum_by_nr(mode));
|
||||||
|
|
||||||
/*
|
if (ctx->Extensions.EXT_framebuffer_object && ctx->CurrentFramebuffer) {
|
||||||
* Do error checking and compute the _DrawDestMask bitfield.
|
/* Set drawbuffer for a framebuffer object */
|
||||||
*/
|
if (mode == GL_NONE) {
|
||||||
|
ctx->CurrentFramebuffer->DrawBuffer[0] = mode;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const GLint k = mode - GL_COLOR_ATTACHMENT0_EXT;
|
||||||
|
if (k >= 0 && k < ctx->Const.MaxColorAttachments) {
|
||||||
|
/* XXX check that the attachment point's Type != GL_NONE */
|
||||||
|
ctx->CurrentFramebuffer->DrawBuffer[0] = mode;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
_mesa_error(ctx, GL_INVALID_ENUM, "glDrawBuffer(mode)");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* conventional behaviour */
|
||||||
|
/* Do error checking and compute the _DrawDestMask bitfield. */
|
||||||
|
GLenum destMask, supportedMask;
|
||||||
|
|
||||||
destMask = draw_buffer_enum_to_bitmask(mode);
|
destMask = draw_buffer_enum_to_bitmask(mode);
|
||||||
if (destMask == ~0u) {
|
if (destMask == ~0u) {
|
||||||
_mesa_error(ctx, GL_INVALID_ENUM, "glDrawBuffer(mode)");
|
_mesa_error(ctx, GL_INVALID_ENUM, "glDrawBuffer(mode)");
|
||||||
@@ -321,6 +340,7 @@ _mesa_DrawBuffer( GLenum mode )
|
|||||||
ctx->Color.DrawBuffer[0] = mode;
|
ctx->Color.DrawBuffer[0] = mode;
|
||||||
ctx->Color._DrawDestMask[0] = destMask;
|
ctx->Color._DrawDestMask[0] = destMask;
|
||||||
ctx->NewState |= _NEW_COLOR;
|
ctx->NewState |= _NEW_COLOR;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Call device driver function.
|
* Call device driver function.
|
||||||
@@ -337,8 +357,6 @@ _mesa_DrawBuffer( GLenum mode )
|
|||||||
void GLAPIENTRY
|
void GLAPIENTRY
|
||||||
_mesa_DrawBuffersARB(GLsizei n, const GLenum *buffers)
|
_mesa_DrawBuffersARB(GLsizei n, const GLenum *buffers)
|
||||||
{
|
{
|
||||||
GLint i;
|
|
||||||
GLuint usedBufferMask, supportedMask;
|
|
||||||
GET_CURRENT_CONTEXT(ctx);
|
GET_CURRENT_CONTEXT(ctx);
|
||||||
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
|
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
|
||||||
|
|
||||||
@@ -347,6 +365,44 @@ _mesa_DrawBuffersARB(GLsizei n, const GLenum *buffers)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ctx->Extensions.EXT_framebuffer_object && ctx->CurrentFramebuffer) {
|
||||||
|
/* Set drawbuffers for a framebuffer object */
|
||||||
|
GLint i;
|
||||||
|
GLuint usedAttachments = 0x0;
|
||||||
|
for (i = 0; i < n; i++) {
|
||||||
|
if (buffers[i] == GL_NONE) {
|
||||||
|
/* OK */
|
||||||
|
ctx->CurrentFramebuffer->DrawBuffer[i] = GL_NONE;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const GLint k = buffers[i] - GL_COLOR_ATTACHMENT0_EXT;
|
||||||
|
if (k >= 0 && k < ctx->Const.MaxColorAttachments) {
|
||||||
|
/* XXX check that the attachment point's Type != GL_NONE */
|
||||||
|
if ((1 << k) & usedAttachments) {
|
||||||
|
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||||
|
"glDrawBuffersARB(duplicated attachment)");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
usedAttachments |= (1 << k);
|
||||||
|
ctx->CurrentFramebuffer->DrawBuffer[i] = buffers[i];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
_mesa_error(ctx, GL_INVALID_ENUM, "glDrawBuffersARB(mode)");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set remaining color outputs to NONE */
|
||||||
|
for (i = n; i < ctx->Const.MaxDrawBuffers; i++) {
|
||||||
|
ctx->CurrentFramebuffer->DrawBuffer[i] = GL_NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* Conventional operation */
|
||||||
|
GLint i;
|
||||||
|
GLuint usedBufferMask, supportedMask;
|
||||||
|
|
||||||
supportedMask = supported_buffer_bitmask(ctx);
|
supportedMask = supported_buffer_bitmask(ctx);
|
||||||
usedBufferMask = 0;
|
usedBufferMask = 0;
|
||||||
for (i = 0; i < n; i++) {
|
for (i = 0; i < n; i++) {
|
||||||
@@ -362,7 +418,7 @@ _mesa_DrawBuffersARB(GLsizei n, const GLenum *buffers)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (destMask & usedBufferMask) {
|
if (destMask & usedBufferMask) {
|
||||||
/* can't use a dest buffer more than once! */
|
/* can't specify a dest buffer more than once! */
|
||||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||||
"glDrawBuffersARB(duplicated buffer)");
|
"glDrawBuffersARB(duplicated buffer)");
|
||||||
return;
|
return;
|
||||||
@@ -374,7 +430,14 @@ _mesa_DrawBuffersARB(GLsizei n, const GLenum *buffers)
|
|||||||
ctx->Color._DrawDestMask[i] = destMask;
|
ctx->Color._DrawDestMask[i] = destMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* set remaining color outputs to NONE */
|
||||||
|
for (i = n; i < ctx->Const.MaxDrawBuffers; i++) {
|
||||||
|
ctx->Color.DrawBuffer[i] = GL_NONE;
|
||||||
|
ctx->Color._DrawDestMask[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
ctx->NewState |= _NEW_COLOR;
|
ctx->NewState |= _NEW_COLOR;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Call device driver function.
|
* Call device driver function.
|
||||||
@@ -398,13 +461,33 @@ _mesa_DrawBuffersARB(GLsizei n, const GLenum *buffers)
|
|||||||
void GLAPIENTRY
|
void GLAPIENTRY
|
||||||
_mesa_ReadBuffer( GLenum mode )
|
_mesa_ReadBuffer( GLenum mode )
|
||||||
{
|
{
|
||||||
GLuint srcMask, supportedMask;
|
|
||||||
GET_CURRENT_CONTEXT(ctx);
|
GET_CURRENT_CONTEXT(ctx);
|
||||||
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
|
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
|
||||||
|
|
||||||
if (MESA_VERBOSE & VERBOSE_API)
|
if (MESA_VERBOSE & VERBOSE_API)
|
||||||
_mesa_debug(ctx, "glReadBuffer %s\n", _mesa_lookup_enum_by_nr(mode));
|
_mesa_debug(ctx, "glReadBuffer %s\n", _mesa_lookup_enum_by_nr(mode));
|
||||||
|
|
||||||
|
if (ctx->Extensions.EXT_framebuffer_object && ctx->CurrentFramebuffer) {
|
||||||
|
/* Set readbuffer for a framebuffer object */
|
||||||
|
if (mode == GL_NONE) {
|
||||||
|
ctx->CurrentFramebuffer->ReadBuffer = mode;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const GLint k = mode - GL_COLOR_ATTACHMENT0_EXT;
|
||||||
|
if (k >= 0 && k < ctx->Const.MaxColorAttachments) {
|
||||||
|
/* XXX check that the attachment point's Type != GL_NONE */
|
||||||
|
ctx->CurrentFramebuffer->ReadBuffer = mode;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
_mesa_error(ctx, GL_INVALID_ENUM, "glReadBuffer(mode)");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* conventional operation */
|
||||||
|
GLuint srcMask, supportedMask;
|
||||||
|
|
||||||
srcMask = read_buffer_enum_to_bitmask(mode);
|
srcMask = read_buffer_enum_to_bitmask(mode);
|
||||||
if (srcMask == ~0u) {
|
if (srcMask == ~0u) {
|
||||||
_mesa_error(ctx, GL_INVALID_ENUM, "glReadBuffer(mode)");
|
_mesa_error(ctx, GL_INVALID_ENUM, "glReadBuffer(mode)");
|
||||||
@@ -418,6 +501,7 @@ _mesa_ReadBuffer( GLenum mode )
|
|||||||
ctx->Pixel._ReadSrcMask = srcMask;
|
ctx->Pixel._ReadSrcMask = srcMask;
|
||||||
ctx->Pixel.ReadBuffer = mode;
|
ctx->Pixel.ReadBuffer = mode;
|
||||||
ctx->NewState |= _NEW_PIXEL;
|
ctx->NewState |= _NEW_PIXEL;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Call device driver function.
|
* Call device driver function.
|
||||||
|
Reference in New Issue
Block a user