state_framebuffer.c revision a076b35761e36233a2a3ba16f77c77d7849170ca
/* $Id$ */
/** @file
* VBox OpenGL: EXT_framebuffer_object state tracking
*/
/*
* Copyright (C) 2009 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
#include "state.h"
#include "state/cr_statetypes.h"
#include "state/cr_statefuncs.h"
#include "state_internals.h"
#include "cr_mem.h"
if (expr) { \
return; \
}
DECLEXPORT(void) STATE_APIENTRY
{
}
void crStateFreeFBO(void *data)
{
#ifndef IN_GUEST
{
}
#endif
}
void crStateFreeRBO(void *data)
{
#ifndef IN_GUEST
{
}
#endif
}
DECLEXPORT(void) STATE_APIENTRY
{
}
DECLEXPORT(void) STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
if (renderbuffer)
{
if (!fbo->renderbuffer)
{
#ifndef IN_GUEST
#endif
}
#ifndef IN_GUEST
#endif
}
}
{
int u;
if (!pFBO)
return;
for (u=0; u<CR_MAX_COLOR_ATTACHMENTS; ++u)
{
{
#ifdef IN_GUEST
#endif
}
}
{
#ifdef IN_GUEST
#endif
}
{
#ifdef IN_GUEST
#endif
}
}
DECLEXPORT(void) STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
int i;
for (i = 0; i < n; i++)
{
if (renderbuffers[i])
{
if (rbo)
{
{
}
/* check the attachments of current framebuffers */
}
}
}
}
DECLEXPORT(void) STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
}
DECLEXPORT(void) STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
switch (pname)
{
break;
break;
break;
break;
default:
}
}
{
}
{
int i;
for (i=0; i<CR_MAX_COLOR_ATTACHMENTS; ++i)
#ifdef IN_GUEST
#endif
}
static GLboolean crStateGetFBOAttachmentPoint(CRFramebufferObject *fb, GLenum attachment, CRFBOAttachmentPoint **ap)
{
switch (attachment)
{
case GL_DEPTH_ATTACHMENT_EXT:
break;
break;
default:
{
}
else return GL_FALSE;
}
return GL_TRUE;
}
DECLEXPORT(void) STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
CRSTATE_FBO_CHECKERR(((target!=GL_FRAMEBUFFER_EXT) && (target!=GL_READ_FRAMEBUFFER) && (target!=GL_DRAW_FRAMEBUFFER)),
GL_INVALID_ENUM, "invalid target");
if (framebuffer)
{
if (!pFBO)
{
#ifndef IN_GUEST
#endif
}
#ifndef IN_GUEST
#endif
}
* FBO status might change when binding a different FBO here...but I doubt it happens.
* So no status reset here until a proper check.
*/
switch (target)
{
case GL_FRAMEBUFFER_EXT:
break;
case GL_READ_FRAMEBUFFER:
break;
case GL_DRAW_FRAMEBUFFER:
break;
}
}
DECLEXPORT(void) STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
int i;
for (i = 0; i < n; i++)
{
if (framebuffers[i])
{
if (fb)
{
{
}
{
}
}
}
}
}
/*@todo: move this function somewhere else*/
/*return floor of base 2 log of x. log(0)==0*/
unsigned int crLog2Floor(unsigned int x)
{
x |= (x >> 1);
x |= (x >> 2);
x |= (x >> 4);
x |= (x >> 8);
x |= (x >> 16);
x -= ((x >> 1) & 0x55555555);
x = (((x >> 2) & 0x33333333) + (x & 0x33333333));
x = (((x >> 4) + x) & 0x0f0f0f0f);
x += (x >> 8);
x += (x >> 16);
return (x & 0x0000003f) - 1;
}
static void crStateFramebufferTextureCheck(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level,
{
CRContext *g = GetCurrentContext();
CRSTATE_FBO_CHECKERR(((target!=GL_FRAMEBUFFER_EXT) && (target!=GL_READ_FRAMEBUFFER) && (target!=GL_DRAW_FRAMEBUFFER)),
GL_INVALID_ENUM, "invalid target");
CRSTATE_FBO_CHECKERR(!crStateGetFBOAttachmentPoint(pFBO, attachment, ap), GL_INVALID_ENUM, "invalid attachment");
if (!texture)
{
return;
}
switch (textarget)
{
break;
case GL_TEXTURE_RECTANGLE_ARB:
maxtexsizelog2 = 0;
break;
case GL_TEXTURE_3D:
break;
case GL_TEXTURE_2D:
case GL_TEXTURE_1D:
break;
default:
}
{
}
#ifdef IN_GUEST
{
}
#endif
}
DECLEXPORT(void) STATE_APIENTRY
crStateFramebufferTexture1DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
{
CRContext *g = GetCurrentContext();
if (failed) return;
if (!texture)
{
return;
}
#ifndef IN_GUEST
#endif
}
DECLEXPORT(void) STATE_APIENTRY
crStateFramebufferTexture2DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
{
CRContext *g = GetCurrentContext();
if (failed) return;
if (!texture)
{
return;
}
CRSTATE_FBO_CHECKERR(GL_TEXTURE_1D==textarget || GL_TEXTURE_3D==textarget, GL_INVALID_OPERATION, "textarget");
#ifndef IN_GUEST
#endif
{
}
}
DECLEXPORT(void) STATE_APIENTRY
crStateFramebufferTexture3DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
{
CRContext *g = GetCurrentContext();
if (failed) return;
if (!texture)
{
return;
}
#ifndef IN_GUEST
#endif
}
DECLEXPORT(void) STATE_APIENTRY
crStateFramebufferRenderbufferEXT(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
{
CRContext *g = GetCurrentContext();
CRSTATE_FBO_CHECKERR(((target!=GL_FRAMEBUFFER_EXT) && (target!=GL_READ_FRAMEBUFFER) && (target!=GL_DRAW_FRAMEBUFFER)),
GL_INVALID_ENUM, "invalid target");
CRSTATE_FBO_CHECKERR(!crStateGetFBOAttachmentPoint(pFBO, attachment, &ap), GL_INVALID_ENUM, "invalid attachment");
if (!renderbuffer)
{
#ifdef IN_GUEST
{
}
#endif
return;
}
#ifdef IN_GUEST
{
}
#endif
}
DECLEXPORT(void) STATE_APIENTRY
crStateGetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment, GLenum pname, GLint *params)
{
CRContext *g = GetCurrentContext();
CRSTATE_FBO_CHECKERR(((target!=GL_FRAMEBUFFER_EXT) && (target!=GL_READ_FRAMEBUFFER) && (target!=GL_DRAW_FRAMEBUFFER)),
GL_INVALID_ENUM, "invalid target");
CRSTATE_FBO_CHECKERR(!crStateGetFBOAttachmentPoint(pFBO, attachment, &ap), GL_INVALID_ENUM, "invalid attachment");
switch (pname)
{
break;
CRSTATE_FBO_CHECKERR(ap->type!=GL_RENDERBUFFER_EXT && ap->type!=GL_TEXTURE, GL_INVALID_ENUM, "can't query object name when it's not bound")
break;
break;
break;
break;
default:
}
}
DECLEXPORT(void) STATE_APIENTRY
{
/*@todo*/
}
{
diff_api.RenderbufferStorageEXT(GL_RENDERBUFFER_EXT, pRBO->internalformat, pRBO->width, pRBO->height);
}
{
{
case GL_TEXTURE:
if (tobj)
{
{
case GL_TEXTURE_1D:
diff_api.FramebufferTexture1DEXT(GL_FRAMEBUFFER_EXT, ap, tobj->target, crStateGetTextureObjHWID(tobj), pAP->level);
break;
case GL_TEXTURE_2D:
case GL_TEXTURE_RECTANGLE_ARB:
diff_api.FramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, ap, tobj->target, crStateGetTextureObjHWID(tobj), pAP->level);
break;
case GL_TEXTURE_CUBE_MAP_ARB:
diff_api.FramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, ap, pAP->face, crStateGetTextureObjHWID(tobj), pAP->level);
break;
case GL_TEXTURE_3D:
diff_api.FramebufferTexture3DEXT(GL_FRAMEBUFFER_EXT, ap, tobj->target, crStateGetTextureObjHWID(tobj), pAP->level, pAP->zoffset);
break;
default:
}
}
else
{
}
break;
case GL_RENDERBUFFER_EXT:
break;
case GL_NONE:
/* Intentionally left blank */
break;
}
}
{
GLint i;
for (i=0; i<CR_MAX_COLOR_ATTACHMENTS; ++i)
{
}
}
DECLEXPORT(void) STATE_APIENTRY
{
{
{
}
else
{
}
}
else
{
{
{
}
else
{
}
diff_api.DrawBuffer(to->framebufferobject.drawFB?to->framebufferobject.drawFB->drawbuffer[0]:to->buffer.drawBuffer);
diff_api.ReadBuffer(to->framebufferobject.readFB?to->framebufferobject.readFB->readbuffer:to->buffer.readBuffer);
}
{
}
}
}
DECLEXPORT(void) STATE_APIENTRY
{
{
}
{
}
{
}
}
DECLEXPORT(void) STATE_APIENTRY
crStateFramebufferObjectReenableHW(CRContext *fromCtx, CRContext *toCtx, GLuint idDrawFBO, GLuint idReadFBO)
{
if ((fromCtx->framebufferobject.drawFB) /* <- the FBO state was reset in crStateFramebufferObjectDisableHW */
&& fromCtx->framebufferobject.drawFB == toCtx->framebufferobject.drawFB) /* .. and it was NOT restored properly in crStateFramebufferObjectSwitch */
{
}
{
}
if ((fromCtx->framebufferobject.readFB) /* <- the FBO state was reset in crStateFramebufferObjectDisableHW */
&& fromCtx->framebufferobject.readFB == toCtx->framebufferobject.readFB) /* .. and it was NOT restored properly in crStateFramebufferObjectSwitch */
{
}
{
}
if (idDrawBuffer)
if (idReadBuffer)
if (fromCtx->framebufferobject.renderbuffer /* <- the FBO state was reset in crStateFramebufferObjectDisableHW */
&& fromCtx->framebufferobject.renderbuffer==toCtx->framebufferobject.renderbuffer) /* .. and it was NOT restored properly in crStateFramebufferObjectSwitch */
{
}
}
{
CRContext *g = GetCurrentContext();
#ifdef DEBUG_misha
#endif
}
{
CRContext *g = GetCurrentContext();
}
{
(void) key;
}
{
(void) key;
}
{
CRContext *g = GetCurrentContext();
}
{
CRContext *g = GetCurrentContext();
}
#ifdef IN_GUEST
{
CRContext *g = GetCurrentContext();
switch (target)
{
case GL_FRAMEBUFFER_EXT:
break;
case GL_READ_FRAMEBUFFER:
break;
case GL_DRAW_FRAMEBUFFER:
break;
}
return status;
}
{
CRContext *g = GetCurrentContext();
switch (target)
{
case GL_FRAMEBUFFER_EXT:
break;
case GL_READ_FRAMEBUFFER:
break;
case GL_DRAW_FRAMEBUFFER:
break;
}
return status;
}
#endif