state_framebuffer.c revision 061bebe04c5bfa05ed733d2a1204389c2a0c96a8
/* $Id$ */
/** @file
* VBox OpenGL: EXT_framebuffer_object state tracking
*/
/*
* Copyright (C) 2009 Sun Microsystems, Inc.
*
* 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.
*
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
* Clara, CA 95054 USA or visit http://www.sun.com if you need
* additional information or have any questions.
*/
#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
{
}
static void crStateFreeFBO(void *data)
{
#ifndef IN_GUEST
{
}
#endif
}
static void crStateFreeRBO(void *data)
{
#ifndef IN_GUEST
{
}
#endif
}
DECLEXPORT(void) STATE_APIENTRY
{
}
DECLEXPORT(void) STATE_APIENTRY
{
CRContext *g = GetCurrentContext();
if (renderbuffer)
{
if (!fbo->renderbuffer)
{
}
}
}
{
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)
{
}
}
* 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;
}
}
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");
{
}
}
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;
}
}
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:
break;
case GL_TEXTURE_2D:
case GL_TEXTURE_RECTANGLE_ARB:
break;
case GL_TEXTURE_CUBE_MAP_ARB:
break;
case GL_TEXTURE_3D:
diff_api.FramebufferTexture3DEXT(GL_FRAMEBUFFER_EXT, ap, tobj->target, pAP->name, 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
{
}
}
{
}
}
}
{
CRContext *g = GetCurrentContext();
CRFramebufferObject *pFBO = (CRFramebufferObject*) crHashtableSearch(g->framebufferobject.framebuffers, id);
}
{
CRContext *g = GetCurrentContext();
CRRenderbufferObject *pRBO = (CRRenderbufferObject*) crHashtableSearch(g->framebufferobject.renderbuffers, id);
}
#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;
}
}
#endif