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#ifndef CR_STATE_BUFFEROBJECT_H
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#define CR_STATE_BUFFEROBJECT_H
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "cr_hash.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#include "state/cr_statetypes.h"
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync#include "state/cr_statefuncs.h"
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef __cplusplus
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsyncextern "C" {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue dirty[CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue arrayBinding[CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue elementsBinding[CR_MAX_BITARRAY];
af8d59d05d72f134aeea62712f1286b369807d52vboxsync CRbitvalue packBinding[CR_MAX_BITARRAY];
af8d59d05d72f134aeea62712f1286b369807d52vboxsync CRbitvalue unpackBinding[CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRBufferObjectBits;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync/*
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * Buffer object, like a texture object, but encapsulates arbitrary
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync * data (vertex, image, etc).
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLuint refCount;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync GLuint id;
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync GLuint hwid;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLenum usage;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLenum access;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLuint size; /* buffer size in bytes */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLvoid *pointer; /* only valid while buffer is mapped */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLvoid *data; /* the buffer data, if retainBufferData is true */
af8d59d05d72f134aeea62712f1286b369807d52vboxsync GLboolean bResyncOnRead; /* buffer data could be changed on server side,
af8d59d05d72f134aeea62712f1286b369807d52vboxsync so we need to resync every time guest wants to read from it*/
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRbitvalue dirty[CR_MAX_BITARRAY]; /* dirty data or state */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLintptrARB dirtyStart, dirtyLength; /* dirty region */
7f3bb583c97fd6f88c66f0047f1cd465afffefb4vboxsync /* bitfield representing the object usage. 1 means the object is used by the context with the given bitid */
7f3bb583c97fd6f88c66f0047f1cd465afffefb4vboxsync CRbitvalue ctxUsage[CR_MAX_BITARRAY];
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRBufferObject;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsynctypedef struct {
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync GLboolean retainBufferData; /* should state tracker retain buffer data? */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRBufferObject *arrayBuffer;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRBufferObject *elementsBuffer;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync CRBufferObject *packBuffer;
af8d59d05d72f134aeea62712f1286b369807d52vboxsync CRBufferObject *unpackBuffer;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync CRBufferObject *nullBuffer; /* name = 0 */
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync} CRBufferObjectState;
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
af8d59d05d72f134aeea62712f1286b369807d52vboxsyncDECLEXPORT(CRBufferObject *) crStateGetBoundBufferObject(GLenum target, CRBufferObjectState *b);
af8d59d05d72f134aeea62712f1286b369807d52vboxsyncDECLEXPORT(GLboolean) crStateIsBufferBound(GLenum target);
e85b92d4df013df97a72864a412eb94eb3f70acevboxsyncstruct CRContext;
e85b92d4df013df97a72864a412eb94eb3f70acevboxsyncDECLEXPORT(GLboolean) crStateIsBufferBoundForCtx(struct CRContext *g, GLenum target);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsyncDECLEXPORT(GLuint) STATE_APIENTRY crStateBufferHWIDtoID(GLuint hwid);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsyncDECLEXPORT(GLuint) STATE_APIENTRY crStateGetBufferHWID(GLuint id);
c62d2520ac91e12cf4665c936f490dd2064152d3vboxsync
ebc248f21b276416f76e20da3add001aff9fc30avboxsyncDECLEXPORT(void) crStateRegBuffers(GLsizei n, GLuint *buffers);
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#ifdef __cplusplus
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync}
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync
e0e0c19eefceaf5d4ec40f9466b58a771f50e799vboxsync#endif /* CR_STATE_BUFFEROBJECT_H */