// SwiftShader Software Renderer | |
// | |
// Copyright(c) 2005-2012 TransGaming Inc. | |
// | |
// All rights reserved. No part of this software may be copied, distributed, transmitted, | |
// transcribed, stored in a retrieval system, translated into any human or computer | |
// language by any means, or disclosed to third parties without the explicit written | |
// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express | |
// or implied, including but not limited to any patent rights, are granted to you. | |
// | |
// VertexDataManager.h: Defines the VertexDataManager, a class that | |
// runs the Buffer translation process. | |
#ifndef LIBGL_VERTEXDATAMANAGER_H_ | |
#define LIBGL_VERTEXDATAMANAGER_H_ | |
#include "Context.h" | |
#include "Device.hpp" | |
#define _GDI32_ | |
#include <windows.h> | |
#include <GL/GL.h> | |
#include <GL/glext.h> | |
namespace gl | |
{ | |
struct TranslatedAttribute | |
{ | |
sw::StreamType type; | |
int count; | |
bool normalized; | |
unsigned int offset; | |
unsigned int stride; // 0 means not to advance the read pointer at all | |
sw::Resource *vertexBuffer; | |
}; | |
class VertexBuffer | |
{ | |
public: | |
VertexBuffer(unsigned int size); | |
virtual ~VertexBuffer(); | |
void unmap(); | |
sw::Resource *getResource() const; | |
protected: | |
sw::Resource *mVertexBuffer; | |
}; | |
class ConstantVertexBuffer : public VertexBuffer | |
{ | |
public: | |
ConstantVertexBuffer(float x, float y, float z, float w); | |
~ConstantVertexBuffer(); | |
}; | |
class StreamingVertexBuffer : public VertexBuffer | |
{ | |
public: | |
StreamingVertexBuffer(unsigned int size); | |
~StreamingVertexBuffer(); | |
void *map(const VertexAttribute &attribute, unsigned int requiredSpace, unsigned int *streamOffset); | |
void reserveRequiredSpace(); | |
void addRequiredSpace(unsigned int requiredSpace); | |
protected: | |
unsigned int mBufferSize; | |
unsigned int mWritePosition; | |
unsigned int mRequiredSpace; | |
}; | |
class VertexDataManager | |
{ | |
public: | |
VertexDataManager(Context *context); | |
virtual ~VertexDataManager(); | |
void dirtyCurrentValue(int index) { mDirtyCurrentValue[index] = true; } | |
GLenum prepareVertexData(GLint start, GLsizei count, TranslatedAttribute *outAttribs); | |
private: | |
unsigned int writeAttributeData(StreamingVertexBuffer *vertexBuffer, GLint start, GLsizei count, const VertexAttribute &attribute); | |
Context *const mContext; | |
StreamingVertexBuffer *mStreamingBuffer; | |
bool mDirtyCurrentValue[MAX_VERTEX_ATTRIBS]; | |
ConstantVertexBuffer *mCurrentValueBuffer[MAX_VERTEX_ATTRIBS]; | |
}; | |
} | |
#endif // LIBGL_VERTEXDATAMANAGER_H_ |