e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/* Copyright (c) 2001, Stanford University
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * All rights reserved
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * See the file LICENSE.txt for information on redistributing this software.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "state.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "state/cr_statetypes.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "state/cr_statefuncs.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "state_internals.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_mem.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrStateOcclusionInit(CRContext *ctx)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CROcclusionState *o = &ctx->occlusion;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync o->objects = crAllocHashtable();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync o->currentQueryObject = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrStateOcclusionDestroy(CRContext *ctx)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CROcclusionState *o = &(ctx->occlusion);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crFreeHashtable(o->objects, crFree);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncstatic CROcclusionObject *
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncNewQueryObject(GLenum target, GLuint id)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CROcclusionObject *q = (CROcclusionObject *) crAlloc(sizeof(CROcclusionObject));
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (q) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync q->target = target;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync q->name = id;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync q->passedCounter = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync q->active = GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return q;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrStateDeleteQueriesARB(GLsizei n, const GLuint *ids)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CROcclusionState *o = &(g->occlusion);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*CRStateBits *sb = GetCurrentBits();*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /*CROcclusionBits *bb = &(sb->occlusion);*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync int i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync FLUSH();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glDeleteQueriesARB called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (n < 0) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glDeleteQueriesARB(n < 0)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < n; i++) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (ids[i]) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CROcclusionObject *q = (CROcclusionObject *)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crHashtableSearch(o->objects, ids[i]);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (q) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crHashtableDelete(o->objects, ids[i], crFree);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrStateGenQueriesARB(GLsizei n, GLuint * queries)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CROcclusionState *o = &(g->occlusion);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint start;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync FLUSH();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGenQueriesARB called in Begin/End");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (n < 0) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_VALUE,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGenQueriesARB(n < 0)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync start = crHashtableAllocKeys(o->objects, n);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (start) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLint i;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync for (i = 0; i < n; i++)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync queries[i] = (GLuint) (start + i);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_OUT_OF_MEMORY, "glGenQueriesARB");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncGLboolean STATE_APIENTRY
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrStateIsQueryARB(GLuint id)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CROcclusionState *o = &(g->occlusion);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync FLUSH();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glIsQueryARB called in begin/end");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (id && crHashtableIsKeyUsed(o->objects, id))
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return GL_TRUE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrStateGetQueryivARB(GLenum target, GLenum pname, GLint *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CROcclusionState *o = &(g->occlusion);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync FLUSH();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetGetQueryivARB called in begin/end");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (pname) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_QUERY_COUNTER_BITS_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = 8 * sizeof(GLuint);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_CURRENT_QUERY_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = o->currentQueryObject;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetGetQueryivARB(pname)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrStateGetQueryObjectivARB(GLuint id, GLenum pname, GLint *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CROcclusionState *o = &(g->occlusion);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CROcclusionObject *q;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync FLUSH();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetGetQueryObjectivARB called in begin/end");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync q = (CROcclusionObject *) crHashtableSearch(o->objects, id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!q || q->active) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetQueryObjectivARB");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (pname) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_QUERY_RESULT_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = q->passedCounter;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_QUERY_RESULT_AVAILABLE_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = GL_TRUE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetQueryObjectivARB(pname)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrStateGetQueryObjectuivARB(GLuint id, GLenum pname, GLuint *params)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CROcclusionState *o = &(g->occlusion);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CROcclusionObject *q;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync FLUSH();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetGetQueryObjectuivARB called in begin/end");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync q = (CROcclusionObject *) crHashtableSearch(o->objects, id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!q || q->active) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetQueryObjectuivARB");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync switch (pname) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_QUERY_RESULT_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = q->passedCounter;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync case GL_QUERY_RESULT_AVAILABLE_ARB:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* XXX revisit when we have a hardware implementation! */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync *params = GL_TRUE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync break;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync default:
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetQueryObjectuivARB(pname)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrStateBeginQueryARB(GLenum target, GLuint id)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CROcclusionState *o = &(g->occlusion);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CROcclusionObject *q;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync FLUSH();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetGetQueryObjectuivARB called in begin/end");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target != GL_SAMPLES_PASSED_ARB) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glBeginQueryARB(target)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (o->currentQueryObject) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glBeginQueryARB(target)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync q = (CROcclusionObject *) crHashtableSearch(o->objects, id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (q && q->active) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION, "glBeginQueryARB");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync else if (!q) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync q = NewQueryObject(target, id);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!q) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_OUT_OF_MEMORY, "glBeginQueryARB");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crHashtableAdd(o->objects, id, q);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync q->active = GL_TRUE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync q->passedCounter = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync q->active = GL_TRUE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync q->passedCounter = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync o->currentQueryObject = id;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid STATE_APIENTRY
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynccrStateEndQueryARB(GLenum target)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *g = GetCurrentContext();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CROcclusionState *o = &(g->occlusion);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CROcclusionObject *q;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync FLUSH();
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (g->current.inBeginEnd) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glGetGetQueryObjectuivARB called in begin/end");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (target != GL_SAMPLES_PASSED_ARB) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_ENUM, "glEndQueryARB(target)");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync q = (CROcclusionObject *) crHashtableSearch(o->objects, o->currentQueryObject);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync if (!q || !q->active) {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync crStateError(__LINE__, __FILE__, GL_INVALID_OPERATION,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync "glEndQueryARB with glBeginQueryARB");
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync return;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync }
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync q->passedCounter = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync q->active = GL_FALSE;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync o->currentQueryObject = 0;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crStateOcclusionDiff(CROcclusionBits *bb, CRbitvalue *bitID,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *fromCtx, CRContext *toCtx)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Apparently, no occlusion state differencing needed */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * XXX this function might need some testing/fixing.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncvoid crStateOcclusionSwitch(CROcclusionBits *bb, CRbitvalue *bitID,
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRContext *fromCtx, CRContext *toCtx)
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync{
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Apparently, no occlusion state switching needed */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync /* Note: we better not do a switch while we're inside a glBeginQuery/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * glEndQuery sequence.
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRASSERT(!fromCtx->occlusion.currentQueryObject);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}