state_framebuffer.c revision 7f3bb583c97fd6f88c66f0047f1cd465afffefb4
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync/* $Id$ */
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
35473cad6d5d5b57348c66f0cfdd7d51d6071ee7vboxsync/** @file
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync * VBox OpenGL: EXT_framebuffer_object state tracking
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync */
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
f001425d2b0a661d4cd1f7ea07b4e7454538c829vboxsync/*
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync * Copyright (C) 2009 Oracle Corporation
fcae7923a3c756b333f1e33eba002edf4448fb54vboxsync *
fcae7923a3c756b333f1e33eba002edf4448fb54vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
fcae7923a3c756b333f1e33eba002edf4448fb54vboxsync * available from http://www.virtualbox.org. This file is free software;
fcae7923a3c756b333f1e33eba002edf4448fb54vboxsync * you can redistribute it and/or modify it under the terms of the GNU
fcae7923a3c756b333f1e33eba002edf4448fb54vboxsync * General Public License (GPL) as published by the Free Software
fcae7923a3c756b333f1e33eba002edf4448fb54vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
fcae7923a3c756b333f1e33eba002edf4448fb54vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
f001425d2b0a661d4cd1f7ea07b4e7454538c829vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
f001425d2b0a661d4cd1f7ea07b4e7454538c829vboxsync */
f001425d2b0a661d4cd1f7ea07b4e7454538c829vboxsync
f001425d2b0a661d4cd1f7ea07b4e7454538c829vboxsync#include "state.h"
f001425d2b0a661d4cd1f7ea07b4e7454538c829vboxsync#include "state/cr_statetypes.h"
f001425d2b0a661d4cd1f7ea07b4e7454538c829vboxsync#include "state/cr_statefuncs.h"
f001425d2b0a661d4cd1f7ea07b4e7454538c829vboxsync#include "state_internals.h"
f001425d2b0a661d4cd1f7ea07b4e7454538c829vboxsync#include "cr_mem.h"
f001425d2b0a661d4cd1f7ea07b4e7454538c829vboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#define CRSTATE_FBO_CHECKERR(expr, result, message) \
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (expr) { \
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateError(__LINE__, __FILE__, result, message); \
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync return; \
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncDECLEXPORT(void) STATE_APIENTRY
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateFramebufferObjectInit(CRContext *ctx)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &ctx->framebufferobject;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fbo->readFB = NULL;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fbo->drawFB = NULL;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fbo->renderbuffer = NULL;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync ctx->shared->bFBOResyncNeeded = GL_FALSE;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncvoid crStateFreeFBO(void *data)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObject *pObj = (CRFramebufferObject *)data;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#ifndef IN_GUEST
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (diff_api.DeleteFramebuffersEXT)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.DeleteFramebuffersEXT(1, &pObj->hwid);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#endif
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crFree(pObj);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
691076bd437d5cd23673a24c5ba7d4cd77127354vboxsync
691076bd437d5cd23673a24c5ba7d4cd77127354vboxsyncvoid crStateFreeRBO(void *data)
691076bd437d5cd23673a24c5ba7d4cd77127354vboxsync{
691076bd437d5cd23673a24c5ba7d4cd77127354vboxsync CRRenderbufferObject *pObj = (CRRenderbufferObject *)data;
691076bd437d5cd23673a24c5ba7d4cd77127354vboxsync
691076bd437d5cd23673a24c5ba7d4cd77127354vboxsync#ifndef IN_GUEST
691076bd437d5cd23673a24c5ba7d4cd77127354vboxsync if (diff_api.DeleteRenderbuffersEXT)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.DeleteRenderbuffersEXT(1, &pObj->hwid);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#endif
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crFree(pObj);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
561b8d2b46fb10887829b7e4d7d29447817adbddvboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncDECLEXPORT(void) STATE_APIENTRY
f65dabff4474710524235022d328b737f174fc1dvboxsynccrStateFramebufferObjectDestroy(CRContext *ctx)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &ctx->framebufferobject;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fbo->readFB = NULL;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fbo->drawFB = NULL;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fbo->renderbuffer = NULL;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncDECLEXPORT(void) STATE_APIENTRY
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateBindRenderbufferEXT(GLenum target, GLuint renderbuffer)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRContext *g = GetCurrentContext();
561b8d2b46fb10887829b7e4d7d29447817adbddvboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
fb4eaa62a6bbeb82a89703d833d39339783feb4avboxsync
fb4eaa62a6bbeb82a89703d833d39339783feb4avboxsync CRSTATE_FBO_CHECKERR(g->current.inBeginEnd, GL_INVALID_OPERATION, "called in begin/end");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(target!=GL_RENDERBUFFER_EXT, GL_INVALID_ENUM, "invalid target");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (renderbuffer)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fbo->renderbuffer = (CRRenderbufferObject*) crHashtableSearch(g->shared->rbTable, renderbuffer);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (!fbo->renderbuffer)
6479169ec893c18a646cec595e4e214492d180f0vboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fbo->renderbuffer = (CRRenderbufferObject*) crCalloc(sizeof(CRRenderbufferObject));
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(!fbo->renderbuffer, GL_OUT_OF_MEMORY, "glBindRenderbufferEXT");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fbo->renderbuffer->id = renderbuffer;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fbo->renderbuffer->hwid = renderbuffer;
a2907076474e923411cc5046492a88787ba377fevboxsync fbo->renderbuffer->internalformat = GL_RGBA;
a2907076474e923411cc5046492a88787ba377fevboxsync crHashtableAdd(g->shared->rbTable, renderbuffer, fbo->renderbuffer);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#ifndef IN_GUEST
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CR_STATE_SHAREDOBJ_USAGE_INIT(fbo->renderbuffer);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#endif
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#ifndef IN_GUEST
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CR_STATE_SHAREDOBJ_USAGE_SET(fbo->renderbuffer, g);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#endif
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync else fbo->renderbuffer = NULL;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncstatic void crStateCheckFBOAttachments(CRFramebufferObject *pFBO, GLuint rbo, GLenum target)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFBOAttachmentPoint *ap;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync int u;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (!pFBO)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync return;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync for (u=0; u<CR_MAX_COLOR_ATTACHMENTS; ++u)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync ap = &pFBO->color[u];
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (ap->type==GL_RENDERBUFFER_EXT && ap->name==rbo)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateFramebufferRenderbufferEXT(target, u+GL_COLOR_ATTACHMENT0_EXT, 0, 0);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#ifdef IN_GUEST
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync pFBO->status = GL_FRAMEBUFFER_UNDEFINED;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#endif
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync ap = &pFBO->depth;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (ap->type==GL_RENDERBUFFER_EXT && ap->name==rbo)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateFramebufferRenderbufferEXT(target, GL_DEPTH_ATTACHMENT_EXT, 0, 0);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#ifdef IN_GUEST
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync pFBO->status = GL_FRAMEBUFFER_UNDEFINED;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#endif
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync ap = &pFBO->stencil;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (ap->type==GL_RENDERBUFFER_EXT && ap->name==rbo)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateFramebufferRenderbufferEXT(target, GL_STENCIL_ATTACHMENT_EXT, 0, 0);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#ifdef IN_GUEST
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync pFBO->status = GL_FRAMEBUFFER_UNDEFINED;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#endif
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncDECLEXPORT(void) STATE_APIENTRY
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateDeleteRenderbuffersEXT(GLsizei n, const GLuint *renderbuffers)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRContext *g = GetCurrentContext();
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync int i;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(g->current.inBeginEnd, GL_INVALID_OPERATION, "called in begin/end");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(n<0, GL_INVALID_OPERATION, "n<0");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync for (i = 0; i < n; i++)
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync {
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync if (renderbuffers[i])
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync {
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync CRRenderbufferObject *rbo;
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync rbo = (CRRenderbufferObject*) crHashtableSearch(g->shared->rbTable, renderbuffers[i]);
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync if (rbo)
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync {
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync if (fbo->renderbuffer==rbo)
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync {
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync fbo->renderbuffer = NULL;
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync }
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync /* check the attachments of current framebuffers */
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync crStateCheckFBOAttachments(fbo->readFB, renderbuffers[i], GL_READ_FRAMEBUFFER);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateCheckFBOAttachments(fbo->drawFB, renderbuffers[i], GL_DRAW_FRAMEBUFFER);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crHashtableDelete(g->shared->rbTable, renderbuffers[i], crStateFreeRBO);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncDECLEXPORT(void) STATE_APIENTRY
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateRenderbufferStorageEXT(GLenum target, GLenum internalformat, GLsizei width, GLsizei height)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRContext *g = GetCurrentContext();
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRRenderbufferObject *rb = fbo->renderbuffer;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(g->current.inBeginEnd, GL_INVALID_OPERATION, "called in begin/end");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(target!=GL_RENDERBUFFER_EXT, GL_INVALID_ENUM, "invalid target");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(!rb, GL_INVALID_OPERATION, "no bound renderbuffer");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync rb->width = width;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync rb->height = height;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync rb->internalformat = internalformat;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncDECLEXPORT(void) STATE_APIENTRY
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateGetRenderbufferParameterivEXT(GLenum target, GLenum pname, GLint *params)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRContext *g = GetCurrentContext();
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRRenderbufferObject *rb = fbo->renderbuffer;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(g->current.inBeginEnd, GL_INVALID_OPERATION, "called in begin/end");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(target!=GL_RENDERBUFFER_EXT, GL_INVALID_ENUM, "invalid target");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(!rb, GL_INVALID_OPERATION, "no bound renderbuffer");
a2907076474e923411cc5046492a88787ba377fevboxsync
a2907076474e923411cc5046492a88787ba377fevboxsync switch (pname)
a2907076474e923411cc5046492a88787ba377fevboxsync {
a2907076474e923411cc5046492a88787ba377fevboxsync case GL_RENDERBUFFER_WIDTH_EXT:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync *params = rb->width;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync break;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync case GL_RENDERBUFFER_HEIGHT_EXT:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync *params = rb->height;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync break;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync case GL_RENDERBUFFER_INTERNAL_FORMAT_EXT:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync *params = rb->internalformat;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync break;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync case GL_RENDERBUFFER_RED_SIZE_EXT:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync case GL_RENDERBUFFER_GREEN_SIZE_EXT:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync case GL_RENDERBUFFER_BLUE_SIZE_EXT:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync case GL_RENDERBUFFER_ALPHA_SIZE_EXT:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync case GL_RENDERBUFFER_DEPTH_SIZE_EXT:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync case GL_RENDERBUFFER_STENCIL_SIZE_EXT:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(GL_TRUE, GL_INVALID_OPERATION, "unimplemented");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync break;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync default:
6479169ec893c18a646cec595e4e214492d180f0vboxsync CRSTATE_FBO_CHECKERR(GL_TRUE, GL_INVALID_ENUM, "invalid pname");
6479169ec893c18a646cec595e4e214492d180f0vboxsync }
6479169ec893c18a646cec595e4e214492d180f0vboxsync}
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncstatic void crStateInitFBOAttachmentPoint(CRFBOAttachmentPoint *fboap)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fboap->type = GL_NONE;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fboap->name = 0;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fboap->level = 0;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fboap->face = GL_TEXTURE_CUBE_MAP_POSITIVE_X;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fboap->zoffset = 0;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncstatic void crStateInitFrameBuffer(CRFramebufferObject *fbo)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync int i;
ed39b7c986cc98221f3f2253f417f79f0f02c942vboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync for (i=0; i<CR_MAX_COLOR_ATTACHMENTS; ++i)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateInitFBOAttachmentPoint(&fbo->color[i]);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateInitFBOAttachmentPoint(&fbo->depth);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateInitFBOAttachmentPoint(&fbo->stencil);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fbo->readbuffer = GL_COLOR_ATTACHMENT0_EXT;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fbo->drawbuffer[0] = GL_COLOR_ATTACHMENT0_EXT;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#ifdef IN_GUEST
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync fbo->status = GL_FRAMEBUFFER_UNDEFINED;
6479169ec893c18a646cec595e4e214492d180f0vboxsync#endif
6479169ec893c18a646cec595e4e214492d180f0vboxsync}
6479169ec893c18a646cec595e4e214492d180f0vboxsync
6479169ec893c18a646cec595e4e214492d180f0vboxsyncstatic GLboolean crStateGetFBOAttachmentPoint(CRFramebufferObject *fb, GLenum attachment, CRFBOAttachmentPoint **ap)
6479169ec893c18a646cec595e4e214492d180f0vboxsync{
6479169ec893c18a646cec595e4e214492d180f0vboxsync switch (attachment)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync case GL_DEPTH_ATTACHMENT_EXT:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync *ap = &fb->depth;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync break;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync case GL_STENCIL_ATTACHMENT_EXT:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync *ap = &fb->stencil;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync break;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync default:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (attachment>=GL_COLOR_ATTACHMENT0_EXT && attachment<=GL_COLOR_ATTACHMENT15_EXT)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync *ap = &fb->color[attachment-GL_COLOR_ATTACHMENT0_EXT];
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync else return GL_FALSE;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync return GL_TRUE;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncDECLEXPORT(void) STATE_APIENTRY
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateBindFramebufferEXT(GLenum target, GLuint framebuffer)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRContext *g = GetCurrentContext();
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObject *pFBO=NULL;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
35473cad6d5d5b57348c66f0cfdd7d51d6071ee7vboxsync CRSTATE_FBO_CHECKERR(g->current.inBeginEnd, GL_INVALID_OPERATION, "called in begin/end");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(((target!=GL_FRAMEBUFFER_EXT) && (target!=GL_READ_FRAMEBUFFER) && (target!=GL_DRAW_FRAMEBUFFER)),
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync GL_INVALID_ENUM, "invalid target");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (framebuffer)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync pFBO = (CRFramebufferObject*) crHashtableSearch(g->shared->fbTable, framebuffer);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (!pFBO)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync pFBO = (CRFramebufferObject*) crCalloc(sizeof(CRFramebufferObject));
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(!pFBO, GL_OUT_OF_MEMORY, "glBindFramebufferEXT");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync pFBO->id = framebuffer;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync pFBO->hwid = framebuffer;
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync crStateInitFrameBuffer(pFBO);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crHashtableAdd(g->shared->fbTable, framebuffer, pFBO);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#ifndef IN_GUEST
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CR_STATE_SHAREDOBJ_USAGE_INIT(pFBO);
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync#endif
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
16e6d031ca3d1ed4d88ae56fb94d9ad6e4d89c6bvboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#ifndef IN_GUEST
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CR_STATE_SHAREDOBJ_USAGE_SET(pFBO, g);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#endif
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync /* @todo: http://www.opengl.org/registry/specs/ARB/framebuffer_object.txt
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync * FBO status might change when binding a different FBO here...but I doubt it happens.
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync * So no status reset here until a proper check.
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync */
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync switch (target)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync case GL_FRAMEBUFFER_EXT:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fbo->readFB = pFBO;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fbo->drawFB = pFBO;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync break;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync case GL_READ_FRAMEBUFFER:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fbo->readFB = pFBO;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync break;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync case GL_DRAW_FRAMEBUFFER:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fbo->drawFB = pFBO;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync break;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncDECLEXPORT(void) STATE_APIENTRY
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateDeleteFramebuffersEXT(GLsizei n, const GLuint *framebuffers)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRContext *g = GetCurrentContext();
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
2084a447d1acb619df7c393fac41b79d517e4b3dvboxsync int i;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(g->current.inBeginEnd, GL_INVALID_OPERATION, "called in begin/end");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(n<0, GL_INVALID_OPERATION, "n<0");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync for (i = 0; i < n; i++)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (framebuffers[i])
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObject *fb;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fb = (CRFramebufferObject*) crHashtableSearch(g->shared->fbTable, framebuffers[i]);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (fb)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (fbo->readFB==fb)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fbo->readFB = NULL;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (fbo->drawFB==fb)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fbo->drawFB = NULL;
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crHashtableDelete(g->shared->fbTable, framebuffers[i], crStateFreeFBO);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync/*@todo: move this function somewhere else*/
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync/*return floor of base 2 log of x. log(0)==0*/
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncunsigned int crLog2Floor(unsigned int x)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync x |= (x >> 1);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync x |= (x >> 2);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync x |= (x >> 4);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync x |= (x >> 8);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync x |= (x >> 16);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync x -= ((x >> 1) & 0x55555555);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync x = (((x >> 2) & 0x33333333) + (x & 0x33333333));
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync x = (((x >> 4) + x) & 0x0f0f0f0f);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync x += (x >> 8);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync x += (x >> 16);
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync return (x & 0x0000003f) - 1;
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync}
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncstatic void crStateFramebufferTextureCheck(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level,
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync GLboolean *failed, CRFBOAttachmentPoint **ap, CRTextureObj **tobj)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRContext *g = GetCurrentContext();
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObject *pFBO;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync GLuint maxtexsizelog2;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync *failed = GL_TRUE;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(g->current.inBeginEnd, GL_INVALID_OPERATION, "called in begin/end");
6479169ec893c18a646cec595e4e214492d180f0vboxsync CRSTATE_FBO_CHECKERR(((target!=GL_FRAMEBUFFER_EXT) && (target!=GL_READ_FRAMEBUFFER) && (target!=GL_DRAW_FRAMEBUFFER)),
6479169ec893c18a646cec595e4e214492d180f0vboxsync GL_INVALID_ENUM, "invalid target");
6479169ec893c18a646cec595e4e214492d180f0vboxsync pFBO = GL_READ_FRAMEBUFFER==target ? fbo->readFB : fbo->drawFB;
09e4ff0eddf453bdf8d622df2b48cff510f7d01dvboxsync CRSTATE_FBO_CHECKERR(!pFBO, GL_INVALID_OPERATION, "no fbo bound");
09e4ff0eddf453bdf8d622df2b48cff510f7d01dvboxsync CRSTATE_FBO_CHECKERR(!crStateGetFBOAttachmentPoint(pFBO, attachment, ap), GL_INVALID_ENUM, "invalid attachment");
6479169ec893c18a646cec595e4e214492d180f0vboxsync
6479169ec893c18a646cec595e4e214492d180f0vboxsync if (!texture)
6479169ec893c18a646cec595e4e214492d180f0vboxsync {
6479169ec893c18a646cec595e4e214492d180f0vboxsync *failed = GL_FALSE;
6479169ec893c18a646cec595e4e214492d180f0vboxsync return;
6479169ec893c18a646cec595e4e214492d180f0vboxsync }
6479169ec893c18a646cec595e4e214492d180f0vboxsync
6479169ec893c18a646cec595e4e214492d180f0vboxsync switch (textarget)
6479169ec893c18a646cec595e4e214492d180f0vboxsync {
6479169ec893c18a646cec595e4e214492d180f0vboxsync case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
6479169ec893c18a646cec595e4e214492d180f0vboxsync case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
6479169ec893c18a646cec595e4e214492d180f0vboxsync case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
6479169ec893c18a646cec595e4e214492d180f0vboxsync case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
6479169ec893c18a646cec595e4e214492d180f0vboxsync case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
6479169ec893c18a646cec595e4e214492d180f0vboxsync case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
6479169ec893c18a646cec595e4e214492d180f0vboxsync maxtexsizelog2 = crLog2Floor(g->limits.maxCubeMapTextureSize);
6479169ec893c18a646cec595e4e214492d180f0vboxsync *tobj = crStateTextureGet(GL_TEXTURE_CUBE_MAP_ARB, texture);
6479169ec893c18a646cec595e4e214492d180f0vboxsync break;
6479169ec893c18a646cec595e4e214492d180f0vboxsync case GL_TEXTURE_RECTANGLE_ARB:
6479169ec893c18a646cec595e4e214492d180f0vboxsync maxtexsizelog2 = 0;
6479169ec893c18a646cec595e4e214492d180f0vboxsync *tobj = crStateTextureGet(textarget, texture);
6479169ec893c18a646cec595e4e214492d180f0vboxsync break;
6479169ec893c18a646cec595e4e214492d180f0vboxsync case GL_TEXTURE_3D:
6479169ec893c18a646cec595e4e214492d180f0vboxsync maxtexsizelog2 = crLog2Floor(g->limits.max3DTextureSize);
6479169ec893c18a646cec595e4e214492d180f0vboxsync *tobj = crStateTextureGet(textarget, texture);
6479169ec893c18a646cec595e4e214492d180f0vboxsync break;
6479169ec893c18a646cec595e4e214492d180f0vboxsync case GL_TEXTURE_2D:
6479169ec893c18a646cec595e4e214492d180f0vboxsync case GL_TEXTURE_1D:
6479169ec893c18a646cec595e4e214492d180f0vboxsync maxtexsizelog2 = crLog2Floor(g->limits.maxTextureSize);
6479169ec893c18a646cec595e4e214492d180f0vboxsync *tobj = crStateTextureGet(textarget, texture);
6479169ec893c18a646cec595e4e214492d180f0vboxsync break;
6479169ec893c18a646cec595e4e214492d180f0vboxsync default:
6479169ec893c18a646cec595e4e214492d180f0vboxsync CRSTATE_FBO_CHECKERR(GL_TRUE, GL_INVALID_OPERATION, "invalid textarget");
6479169ec893c18a646cec595e4e214492d180f0vboxsync }
6479169ec893c18a646cec595e4e214492d180f0vboxsync
6479169ec893c18a646cec595e4e214492d180f0vboxsync CRSTATE_FBO_CHECKERR(!*tobj, GL_INVALID_OPERATION, "invalid textarget/texture combo");
6479169ec893c18a646cec595e4e214492d180f0vboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (GL_TEXTURE_RECTANGLE_ARB==textarget)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(level!=0, GL_INVALID_VALUE, "non zero mipmap level");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(level<0, GL_INVALID_VALUE, "level<0");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(level>maxtexsizelog2, GL_INVALID_VALUE, "level too big");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync *failed = GL_FALSE;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#ifdef IN_GUEST
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if ((*ap)->type!=GL_TEXTURE || (*ap)->name!=texture || (*ap)->level!=level)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync pFBO->status = GL_FRAMEBUFFER_UNDEFINED;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#endif
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncDECLEXPORT(void) STATE_APIENTRY
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateFramebufferTexture1DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRContext *g = GetCurrentContext();
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFBOAttachmentPoint *ap;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRTextureObj *tobj;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync GLboolean failed;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateFramebufferTextureCheck(target, attachment, textarget, texture, level, &failed, &ap, &tobj);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (failed) return;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (!texture)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateInitFBOAttachmentPoint(ap);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync return;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(textarget!=GL_TEXTURE_1D, GL_INVALID_OPERATION, "textarget");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#ifndef IN_GUEST
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CR_STATE_SHAREDOBJ_USAGE_SET(tobj, g);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#endif
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateInitFBOAttachmentPoint(ap);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync ap->type = GL_TEXTURE;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync ap->name = texture;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync ap->level = level;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncDECLEXPORT(void) STATE_APIENTRY
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateFramebufferTexture2DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level)
ad27e1d5e48ca41245120c331cc88b50464813cevboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRContext *g = GetCurrentContext();
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFBOAttachmentPoint *ap;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRTextureObj *tobj;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync GLboolean failed;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateFramebufferTextureCheck(target, attachment, textarget, texture, level, &failed, &ap, &tobj);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (failed) return;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (!texture)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateInitFBOAttachmentPoint(ap);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync return;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(GL_TEXTURE_1D==textarget || GL_TEXTURE_3D==textarget, GL_INVALID_OPERATION, "textarget");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#ifndef IN_GUEST
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CR_STATE_SHAREDOBJ_USAGE_SET(tobj, g);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#endif
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateInitFBOAttachmentPoint(ap);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync ap->type = GL_TEXTURE;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync ap->name = texture;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync ap->level = level;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (textarget!=GL_TEXTURE_2D && textarget!=GL_TEXTURE_RECTANGLE_ARB)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync ap->face = textarget;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncDECLEXPORT(void) STATE_APIENTRY
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateFramebufferTexture3DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRContext *g = GetCurrentContext();
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFBOAttachmentPoint *ap;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRTextureObj *tobj;
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync GLboolean failed;
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateFramebufferTextureCheck(target, attachment, textarget, texture, level, &failed, &ap, &tobj);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (failed) return;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (!texture)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateInitFBOAttachmentPoint(ap);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync return;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(zoffset>(g->limits.max3DTextureSize-1), GL_INVALID_VALUE, "zoffset too big");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(textarget!=GL_TEXTURE_3D, GL_INVALID_OPERATION, "textarget");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#ifndef IN_GUEST
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CR_STATE_SHAREDOBJ_USAGE_SET(tobj, g);
6479169ec893c18a646cec595e4e214492d180f0vboxsync#endif
6479169ec893c18a646cec595e4e214492d180f0vboxsync
6479169ec893c18a646cec595e4e214492d180f0vboxsync crStateInitFBOAttachmentPoint(ap);
6479169ec893c18a646cec595e4e214492d180f0vboxsync ap->type = GL_TEXTURE;
6479169ec893c18a646cec595e4e214492d180f0vboxsync ap->name = texture;
1519f0483877fddc0a03ab7e3382124f889bb36avboxsync ap->level = level;
1519f0483877fddc0a03ab7e3382124f889bb36avboxsync ap->zoffset = zoffset;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncDECLEXPORT(void) STATE_APIENTRY
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateFramebufferRenderbufferEXT(GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer)
1519f0483877fddc0a03ab7e3382124f889bb36avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRContext *g = GetCurrentContext();
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObject *pFBO;
6479169ec893c18a646cec595e4e214492d180f0vboxsync CRFBOAttachmentPoint *ap;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRRenderbufferObject *rb;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(g->current.inBeginEnd, GL_INVALID_OPERATION, "called in begin/end");
1519f0483877fddc0a03ab7e3382124f889bb36avboxsync CRSTATE_FBO_CHECKERR(((target!=GL_FRAMEBUFFER_EXT) && (target!=GL_READ_FRAMEBUFFER) && (target!=GL_DRAW_FRAMEBUFFER)),
1519f0483877fddc0a03ab7e3382124f889bb36avboxsync GL_INVALID_ENUM, "invalid target");
1519f0483877fddc0a03ab7e3382124f889bb36avboxsync pFBO = GL_READ_FRAMEBUFFER==target ? fbo->readFB : fbo->drawFB;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(!pFBO, GL_INVALID_OPERATION, "no fbo bound");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(!crStateGetFBOAttachmentPoint(pFBO, attachment, &ap), GL_INVALID_ENUM, "invalid attachment");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (!renderbuffer)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#ifdef IN_GUEST
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (ap->type!=GL_NONE)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync pFBO->status = GL_FRAMEBUFFER_UNDEFINED;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#endif
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateInitFBOAttachmentPoint(ap);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync return;
2084a447d1acb619df7c393fac41b79d517e4b3dvboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync rb = (CRRenderbufferObject*) crHashtableSearch(g->shared->rbTable, renderbuffer);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(!rb, GL_INVALID_OPERATION, "rb doesn't exist");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#ifdef IN_GUEST
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (ap->type!=GL_RENDERBUFFER_EXT || ap->name!=renderbuffer)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync pFBO->status = GL_FRAMEBUFFER_UNDEFINED;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#endif
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateInitFBOAttachmentPoint(ap);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync ap->type = GL_RENDERBUFFER_EXT;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync ap->name = renderbuffer;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncDECLEXPORT(void) STATE_APIENTRY
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateGetFramebufferAttachmentParameterivEXT(GLenum target, GLenum attachment, GLenum pname, GLint *params)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRContext *g = GetCurrentContext();
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObject *pFBO;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFBOAttachmentPoint *ap;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(g->current.inBeginEnd, GL_INVALID_OPERATION, "called in begin/end");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(((target!=GL_FRAMEBUFFER_EXT) && (target!=GL_READ_FRAMEBUFFER) && (target!=GL_DRAW_FRAMEBUFFER)),
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync GL_INVALID_ENUM, "invalid target");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync pFBO = GL_READ_FRAMEBUFFER==target ? fbo->readFB : fbo->drawFB;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(!pFBO, GL_INVALID_OPERATION, "no fbo bound");
6479169ec893c18a646cec595e4e214492d180f0vboxsync CRSTATE_FBO_CHECKERR(!crStateGetFBOAttachmentPoint(pFBO, attachment, &ap), GL_INVALID_ENUM, "invalid attachment");
6479169ec893c18a646cec595e4e214492d180f0vboxsync
6479169ec893c18a646cec595e4e214492d180f0vboxsync switch (pname)
6479169ec893c18a646cec595e4e214492d180f0vboxsync {
6479169ec893c18a646cec595e4e214492d180f0vboxsync case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT:
6479169ec893c18a646cec595e4e214492d180f0vboxsync *params = ap->type;
6479169ec893c18a646cec595e4e214492d180f0vboxsync break;
6479169ec893c18a646cec595e4e214492d180f0vboxsync case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT:
6479169ec893c18a646cec595e4e214492d180f0vboxsync 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")
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync *params = ap->name;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync break;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(ap->type!=GL_TEXTURE, GL_INVALID_ENUM, "not a texture");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync *params = ap->level;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync break;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(ap->type!=GL_TEXTURE, GL_INVALID_ENUM, "not a texture");
1519f0483877fddc0a03ab7e3382124f889bb36avboxsync *params = ap->face;
1519f0483877fddc0a03ab7e3382124f889bb36avboxsync break;
1519f0483877fddc0a03ab7e3382124f889bb36avboxsync case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(ap->type!=GL_TEXTURE, GL_INVALID_ENUM, "not a texture");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync *params = ap->zoffset;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync break;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync default:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRSTATE_FBO_CHECKERR(GL_TRUE, GL_INVALID_ENUM, "invalid pname");
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
6479169ec893c18a646cec595e4e214492d180f0vboxsync
6479169ec893c18a646cec595e4e214492d180f0vboxsyncDECLEXPORT(void) STATE_APIENTRY
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateGenerateMipmapEXT(GLenum target)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync /*@todo*/
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncstatic void crStateSyncRenderbuffersCB(unsigned long key, void *data1, void *data2)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRRenderbufferObject *pRBO = (CRRenderbufferObject*) data1;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.GenRenderbuffersEXT(1, &pRBO->hwid);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.BindRenderbufferEXT(GL_RENDERBUFFER_EXT, pRBO->hwid);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.RenderbufferStorageEXT(GL_RENDERBUFFER_EXT, pRBO->internalformat, pRBO->width, pRBO->height);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncstatic void crStateSyncAP(CRFBOAttachmentPoint *pAP, GLenum ap, CRContext *ctx)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRRenderbufferObject *pRBO;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRTextureObj *tobj;
6479169ec893c18a646cec595e4e214492d180f0vboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync switch (pAP->type)
6479169ec893c18a646cec595e4e214492d180f0vboxsync {
6479169ec893c18a646cec595e4e214492d180f0vboxsync case GL_TEXTURE:
6479169ec893c18a646cec595e4e214492d180f0vboxsync CRASSERT(pAP->name!=0);
6479169ec893c18a646cec595e4e214492d180f0vboxsync
6479169ec893c18a646cec595e4e214492d180f0vboxsync tobj = (CRTextureObj *) crHashtableSearch(ctx->shared->textureTable, pAP->name);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (tobj)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRASSERT(!tobj->id || tobj->hwid);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync switch (tobj->target)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync case GL_TEXTURE_1D:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.FramebufferTexture1DEXT(GL_FRAMEBUFFER_EXT, ap, tobj->target, crStateGetTextureObjHWID(tobj), pAP->level);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync break;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync case GL_TEXTURE_2D:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync case GL_TEXTURE_RECTANGLE_ARB:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.FramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, ap, tobj->target, crStateGetTextureObjHWID(tobj), pAP->level);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync break;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync case GL_TEXTURE_CUBE_MAP_ARB:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.FramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, ap, pAP->face, crStateGetTextureObjHWID(tobj), pAP->level);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync break;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync case GL_TEXTURE_3D:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.FramebufferTexture3DEXT(GL_FRAMEBUFFER_EXT, ap, tobj->target, crStateGetTextureObjHWID(tobj), pAP->level, pAP->zoffset);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync break;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync default:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crWarning("Unexpected textarget %d", tobj->target);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync else
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crWarning("Unknown texture id %d", pAP->name);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync break;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync case GL_RENDERBUFFER_EXT:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync pRBO = (CRRenderbufferObject*) crHashtableSearch(ctx->shared->rbTable, pAP->name);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.FramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, ap, GL_RENDERBUFFER_EXT, pRBO->hwid);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync break;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync case GL_NONE:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync /* Intentionally left blank */
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync break;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync default: crWarning("Invalid attachment point type %d (ap: %i)", pAP->type, ap);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync}
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsyncstatic void crStateSyncFramebuffersCB(unsigned long key, void *data1, void *data2)
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObject *pFBO = (CRFramebufferObject*) data1;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRContext *ctx = (CRContext*) data2;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync GLint i;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.GenFramebuffersEXT(1, &pFBO->hwid);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.BindFramebufferEXT(GL_FRAMEBUFFER_EXT, pFBO->hwid);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync for (i=0; i<CR_MAX_COLOR_ATTACHMENTS; ++i)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateSyncAP(&pFBO->color[i], GL_COLOR_ATTACHMENT0_EXT+i, ctx);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
14a3a4c9d0c43ff4b0e32ee6e45e5c842527dc6dvboxsync crStateSyncAP(&pFBO->depth, GL_DEPTH_ATTACHMENT_EXT, ctx);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crStateSyncAP(&pFBO->stencil, GL_STENCIL_ATTACHMENT_EXT, ctx);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncDECLEXPORT(void) STATE_APIENTRY
1403063c7e0c0a072d59e323b66068b06278fb9avboxsynccrStateFramebufferObjectSwitch(CRContext *from, CRContext *to)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync if (to->shared->bFBOResyncNeeded)
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync to->shared->bFBOResyncNeeded = GL_FALSE;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync crHashtableWalk(to->shared->rbTable, crStateSyncRenderbuffersCB, NULL);
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync crHashtableWalk(to->shared->fbTable, crStateSyncFramebuffersCB, to);
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync if (to->framebufferobject.drawFB==to->framebufferobject.readFB)
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync {
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync diff_api.BindFramebufferEXT(GL_FRAMEBUFFER_EXT, to->framebufferobject.drawFB?
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync to->framebufferobject.drawFB->hwid:0);
2084a447d1acb619df7c393fac41b79d517e4b3dvboxsync }
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync else
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync {
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync diff_api.BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, to->framebufferobject.drawFB?
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync to->framebufferobject.drawFB->hwid:0);
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync diff_api.BindFramebufferEXT(GL_READ_FRAMEBUFFER, to->framebufferobject.readFB?
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync to->framebufferobject.readFB->hwid:0);
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync }
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync diff_api.BindRenderbufferEXT(GL_RENDERBUFFER_EXT, to->framebufferobject.renderbuffer?
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync to->framebufferobject.renderbuffer->hwid:0);
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync }
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync else
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync {
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync if (to->framebufferobject.drawFB!=from->framebufferobject.drawFB
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync || to->framebufferobject.readFB!=from->framebufferobject.readFB)
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync {
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync if (to->framebufferobject.drawFB==to->framebufferobject.readFB)
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync {
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync diff_api.BindFramebufferEXT(GL_FRAMEBUFFER_EXT, to->framebufferobject.drawFB?
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync to->framebufferobject.drawFB->hwid:0);
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync }
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync else
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync {
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync diff_api.BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, to->framebufferobject.drawFB?
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync to->framebufferobject.drawFB->hwid:0);
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync diff_api.BindFramebufferEXT(GL_READ_FRAMEBUFFER, to->framebufferobject.readFB?
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync to->framebufferobject.readFB->hwid:0);
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync }
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync diff_api.DrawBuffer(to->framebufferobject.drawFB?to->framebufferobject.drawFB->drawbuffer[0]:to->buffer.drawBuffer);
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync diff_api.ReadBuffer(to->framebufferobject.readFB?to->framebufferobject.readFB->readbuffer:to->buffer.readBuffer);
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync }
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync if (to->framebufferobject.renderbuffer!=from->framebufferobject.renderbuffer)
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.BindRenderbufferEXT(GL_RENDERBUFFER_EXT, to->framebufferobject.renderbuffer?
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync to->framebufferobject.renderbuffer->hwid:0);
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync}
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsyncDECLEXPORT(void) STATE_APIENTRY
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsynccrStateFramebufferObjectDisableHW(CRContext *ctx)
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync{
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync GLboolean fAdjustDrawReadBuffers = GL_FALSE;
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync if (ctx->framebufferobject.drawFB)
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync {
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync diff_api.BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, 0);
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync fAdjustDrawReadBuffers = GL_TRUE;
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync }
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (ctx->framebufferobject.readFB)
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.BindFramebufferEXT(GL_READ_FRAMEBUFFER, 0);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fAdjustDrawReadBuffers = GL_TRUE;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync if (fAdjustDrawReadBuffers)
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.DrawBuffer(GL_BACK);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.ReadBuffer(GL_BACK);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync if (ctx->framebufferobject.renderbuffer)
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync diff_api.BindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsyncDECLEXPORT(void) STATE_APIENTRY
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsynccrStateFramebufferObjectReenableHW(CRContext *fromCtx, CRContext *toCtx)
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync GLboolean fAdjustDrawReadBuffers = GL_FALSE;
f48c3167a0f99da174686b66dc4e666f38ecae46vboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (fromCtx->framebufferobject.drawFB /* <- the FBO state was reset in crStateFramebufferObjectDisableHW */
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync && fromCtx->framebufferobject.drawFB == toCtx->framebufferobject.drawFB) /* .. and it was NOT restored properly in crStateFramebufferObjectSwitch */
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync diff_api.BindFramebufferEXT(GL_DRAW_FRAMEBUFFER, toCtx->framebufferobject.drawFB->hwid);
72cc0d1a8b7c8406808a92eb0b9eb58bf6f8c3aavboxsync fAdjustDrawReadBuffers = GL_TRUE;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (fromCtx->framebufferobject.readFB /* <- the FBO state was reset in crStateFramebufferObjectDisableHW */
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync && fromCtx->framebufferobject.readFB == toCtx->framebufferobject.readFB) /* .. and it was NOT restored properly in crStateFramebufferObjectSwitch */
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.BindFramebufferEXT(GL_READ_FRAMEBUFFER, toCtx->framebufferobject.readFB->hwid);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync fAdjustDrawReadBuffers = GL_TRUE;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (fAdjustDrawReadBuffers)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.DrawBuffer(toCtx->framebufferobject.drawFB?toCtx->framebufferobject.drawFB->drawbuffer[0]:toCtx->buffer.drawBuffer);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.ReadBuffer(toCtx->framebufferobject.readFB?toCtx->framebufferobject.readFB->readbuffer:toCtx->buffer.readBuffer);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (fromCtx->framebufferobject.renderbuffer /* <- the FBO state was reset in crStateFramebufferObjectDisableHW */
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync && fromCtx->framebufferobject.renderbuffer==toCtx->framebufferobject.renderbuffer) /* .. and it was NOT restored properly in crStateFramebufferObjectSwitch */
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync {
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync diff_api.BindRenderbufferEXT(GL_RENDERBUFFER_EXT, toCtx->framebufferobject.renderbuffer->hwid);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncDECLEXPORT(GLuint) STATE_APIENTRY crStateGetFramebufferHWID(GLuint id)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRContext *g = GetCurrentContext();
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObject *pFBO = (CRFramebufferObject*) crHashtableSearch(g->shared->fbTable, id);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#ifdef DEBUG_misha
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crDebug("FB id(%d) hw(%d)", id, pFBO ? pFBO->hwid : 0);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync#endif
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync return pFBO ? pFBO->hwid : 0;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncDECLEXPORT(GLuint) STATE_APIENTRY crStateGetRenderbufferHWID(GLuint id)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRContext *g = GetCurrentContext();
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRRenderbufferObject *pRBO = (CRRenderbufferObject*) crHashtableSearch(g->shared->rbTable, id);
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync return pRBO ? pRBO->hwid : 0;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncstatic void crStateCheckFBOHWIDCB(unsigned long key, void *data1, void *data2)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRFramebufferObject *pFBO = (CRFramebufferObject *) data1;
6479169ec893c18a646cec595e4e214492d180f0vboxsync crCheckIDHWID_t *pParms = (crCheckIDHWID_t*) data2;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync (void) key;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (pFBO->hwid==pParms->hwid)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync pParms->id = pFBO->id;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync}
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsyncstatic void crStateCheckRBOHWIDCB(unsigned long key, void *data1, void *data2)
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync{
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync CRRenderbufferObject *pRBO = (CRRenderbufferObject *) data1;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync crCheckIDHWID_t *pParms = (crCheckIDHWID_t*) data2;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync (void) key;
6479169ec893c18a646cec595e4e214492d180f0vboxsync
6479169ec893c18a646cec595e4e214492d180f0vboxsync if (pRBO->hwid==pParms->hwid)
6479169ec893c18a646cec595e4e214492d180f0vboxsync pParms->id = pRBO->id;
6479169ec893c18a646cec595e4e214492d180f0vboxsync}
6479169ec893c18a646cec595e4e214492d180f0vboxsync
6479169ec893c18a646cec595e4e214492d180f0vboxsyncDECLEXPORT(GLuint) STATE_APIENTRY crStateFBOHWIDtoID(GLuint hwid)
6479169ec893c18a646cec595e4e214492d180f0vboxsync{
6479169ec893c18a646cec595e4e214492d180f0vboxsync CRContext *g = GetCurrentContext();
6479169ec893c18a646cec595e4e214492d180f0vboxsync crCheckIDHWID_t parms;
6479169ec893c18a646cec595e4e214492d180f0vboxsync
6479169ec893c18a646cec595e4e214492d180f0vboxsync parms.id = hwid;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync parms.hwid = hwid;
35473cad6d5d5b57348c66f0cfdd7d51d6071ee7vboxsync
69132a0ec44f2ef9702c43e6c051cffb051d83a2vboxsync crHashtableWalk(g->shared->fbTable, crStateCheckFBOHWIDCB, &parms);
35473cad6d5d5b57348c66f0cfdd7d51d6071ee7vboxsync return parms.id;
69132a0ec44f2ef9702c43e6c051cffb051d83a2vboxsync}
69132a0ec44f2ef9702c43e6c051cffb051d83a2vboxsync
69132a0ec44f2ef9702c43e6c051cffb051d83a2vboxsyncDECLEXPORT(GLuint) STATE_APIENTRY crStateRBOHWIDtoID(GLuint hwid)
69132a0ec44f2ef9702c43e6c051cffb051d83a2vboxsync{
35473cad6d5d5b57348c66f0cfdd7d51d6071ee7vboxsync CRContext *g = GetCurrentContext();
69132a0ec44f2ef9702c43e6c051cffb051d83a2vboxsync crCheckIDHWID_t parms;
35473cad6d5d5b57348c66f0cfdd7d51d6071ee7vboxsync
a51cca35cccb7500e3f5c28c0615d3c82973003avboxsync parms.id = hwid;
69132a0ec44f2ef9702c43e6c051cffb051d83a2vboxsync parms.hwid = hwid;
69132a0ec44f2ef9702c43e6c051cffb051d83a2vboxsync
69132a0ec44f2ef9702c43e6c051cffb051d83a2vboxsync crHashtableWalk(g->shared->rbTable, crStateCheckRBOHWIDCB, &parms);
35473cad6d5d5b57348c66f0cfdd7d51d6071ee7vboxsync return parms.id;
35473cad6d5d5b57348c66f0cfdd7d51d6071ee7vboxsync}
35473cad6d5d5b57348c66f0cfdd7d51d6071ee7vboxsync
35473cad6d5d5b57348c66f0cfdd7d51d6071ee7vboxsync#ifdef IN_GUEST
35473cad6d5d5b57348c66f0cfdd7d51d6071ee7vboxsyncDECLEXPORT(GLenum) STATE_APIENTRY crStateCheckFramebufferStatusEXT(GLenum target)
35473cad6d5d5b57348c66f0cfdd7d51d6071ee7vboxsync{
35473cad6d5d5b57348c66f0cfdd7d51d6071ee7vboxsync GLenum status = GL_FRAMEBUFFER_UNDEFINED;
69132a0ec44f2ef9702c43e6c051cffb051d83a2vboxsync CRContext *g = GetCurrentContext();
35473cad6d5d5b57348c66f0cfdd7d51d6071ee7vboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
144c0e9632fc5508a2bdb7269b5857f1b9a072f8vboxsync CRFramebufferObject *pFBO=NULL;
69132a0ec44f2ef9702c43e6c051cffb051d83a2vboxsync
69132a0ec44f2ef9702c43e6c051cffb051d83a2vboxsync switch (target)
69132a0ec44f2ef9702c43e6c051cffb051d83a2vboxsync {
35473cad6d5d5b57348c66f0cfdd7d51d6071ee7vboxsync case GL_FRAMEBUFFER_EXT:
35473cad6d5d5b57348c66f0cfdd7d51d6071ee7vboxsync pFBO = fbo->drawFB;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync break;
6479169ec893c18a646cec595e4e214492d180f0vboxsync case GL_READ_FRAMEBUFFER:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync pFBO = fbo->readFB;
6479169ec893c18a646cec595e4e214492d180f0vboxsync break;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync case GL_DRAW_FRAMEBUFFER:
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync pFBO = fbo->drawFB;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync break;
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync }
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync
1403063c7e0c0a072d59e323b66068b06278fb9avboxsync if (pFBO) status = pFBO->status;
f65dabff4474710524235022d328b737f174fc1dvboxsync
f65dabff4474710524235022d328b737f174fc1dvboxsync return status;
f65dabff4474710524235022d328b737f174fc1dvboxsync}
f65dabff4474710524235022d328b737f174fc1dvboxsync
f65dabff4474710524235022d328b737f174fc1dvboxsyncDECLEXPORT(GLenum) STATE_APIENTRY crStateSetFramebufferStatus(GLenum target, GLenum status)
f65dabff4474710524235022d328b737f174fc1dvboxsync{
f65dabff4474710524235022d328b737f174fc1dvboxsync CRContext *g = GetCurrentContext();
f65dabff4474710524235022d328b737f174fc1dvboxsync CRFramebufferObjectState *fbo = &g->framebufferobject;
f65dabff4474710524235022d328b737f174fc1dvboxsync CRFramebufferObject *pFBO=NULL;
f65dabff4474710524235022d328b737f174fc1dvboxsync
f65dabff4474710524235022d328b737f174fc1dvboxsync switch (target)
f65dabff4474710524235022d328b737f174fc1dvboxsync {
f65dabff4474710524235022d328b737f174fc1dvboxsync case GL_FRAMEBUFFER_EXT:
f65dabff4474710524235022d328b737f174fc1dvboxsync pFBO = fbo->drawFB;
f65dabff4474710524235022d328b737f174fc1dvboxsync break;
f65dabff4474710524235022d328b737f174fc1dvboxsync case GL_READ_FRAMEBUFFER:
f65dabff4474710524235022d328b737f174fc1dvboxsync pFBO = fbo->readFB;
f65dabff4474710524235022d328b737f174fc1dvboxsync break;
f65dabff4474710524235022d328b737f174fc1dvboxsync case GL_DRAW_FRAMEBUFFER:
f65dabff4474710524235022d328b737f174fc1dvboxsync pFBO = fbo->drawFB;
f65dabff4474710524235022d328b737f174fc1dvboxsync break;
f65dabff4474710524235022d328b737f174fc1dvboxsync }
f65dabff4474710524235022d328b737f174fc1dvboxsync
f65dabff4474710524235022d328b737f174fc1dvboxsync if (pFBO) pFBO->status = status;
f65dabff4474710524235022d328b737f174fc1dvboxsync
f65dabff4474710524235022d328b737f174fc1dvboxsync return status;
f65dabff4474710524235022d328b737f174fc1dvboxsync}
f65dabff4474710524235022d328b737f174fc1dvboxsync#endif
f65dabff4474710524235022d328b737f174fc1dvboxsync