// // Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // geometry/VertexDataManager.h: Defines the VertexDataManager, a class that // runs the Buffer translation process. #ifndef LIBGLESV2_GEOMETRY_VERTEXDATAMANAGER_H_ #define LIBGLESV2_GEOMETRY_VERTEXDATAMANAGER_H_ #include <vector> #include <cstddef> #define GL_APICALL #include <GLES2/gl2.h> #include "libGLESv2/Context.h" namespace gl { struct TranslatedAttribute { bool active; D3DDECLTYPE type; UINT offset; UINT stride; // 0 means not to advance the read pointer at all UINT semanticIndex; IDirect3DVertexBuffer9 *vertexBuffer; }; class VertexBuffer { public: VertexBuffer(IDirect3DDevice9 *device, UINT size, DWORD usageFlags); virtual ~VertexBuffer(); void unmap(); IDirect3DVertexBuffer9 *getBuffer() const; protected: IDirect3DDevice9 *const mDevice; IDirect3DVertexBuffer9 *mVertexBuffer; private: DISALLOW_COPY_AND_ASSIGN(VertexBuffer); }; class ConstantVertexBuffer : public VertexBuffer { public: ConstantVertexBuffer(IDirect3DDevice9 *device, float x, float y, float z, float w); ~ConstantVertexBuffer(); }; class ArrayVertexBuffer : public VertexBuffer { public: ArrayVertexBuffer(IDirect3DDevice9 *device, UINT size, DWORD usageFlags); ~ArrayVertexBuffer(); UINT size() const { return mBufferSize; } virtual void *map(const VertexAttribute &attribute, UINT requiredSpace, UINT *streamOffset) = 0; virtual void reserveRequiredSpace() = 0; void addRequiredSpace(UINT requiredSpace); void addRequiredSpaceFor(ArrayVertexBuffer *buffer); protected: UINT mBufferSize; UINT mWritePosition; UINT mRequiredSpace; }; class StreamingVertexBuffer : public ArrayVertexBuffer { public: StreamingVertexBuffer(IDirect3DDevice9 *device, UINT initialSize); ~StreamingVertexBuffer(); void *map(const VertexAttribute &attribute, UINT requiredSpace, UINT *streamOffset); void reserveRequiredSpace(); }; class StaticVertexBuffer : public ArrayVertexBuffer { public: explicit StaticVertexBuffer(IDirect3DDevice9 *device); ~StaticVertexBuffer(); void *map(const VertexAttribute &attribute, UINT requiredSpace, UINT *streamOffset); void reserveRequiredSpace(); UINT lookupAttribute(const VertexAttribute &attribute); // Returns the offset into the vertex buffer, or -1 if not found private: struct VertexElement { GLenum type; GLint size; bool normalized; int attributeOffset; UINT streamOffset; }; std::vector<VertexElement> mCache; }; class VertexDataManager { public: VertexDataManager(Context *context, IDirect3DDevice9 *backend); virtual ~VertexDataManager(); void dirtyCurrentValue(int index) { mDirtyCurrentValue[index] = true; } void setupAttributes(const TranslatedAttribute *attributes); GLenum prepareVertexData(GLint start, GLsizei count, TranslatedAttribute *outAttribs); private: DISALLOW_COPY_AND_ASSIGN(VertexDataManager); UINT spaceRequired(const VertexAttribute &attrib, std::size_t count) const; UINT writeAttributeData(ArrayVertexBuffer *vertexBuffer, GLint start, GLsizei count, const VertexAttribute &attribute); Context *const mContext; IDirect3DDevice9 *const mDevice; StreamingVertexBuffer *mStreamingBuffer; bool mDirtyCurrentValue[MAX_VERTEX_ATTRIBS]; ConstantVertexBuffer *mCurrentValueBuffer[MAX_VERTEX_ATTRIBS]; // Attribute format conversion struct FormatConverter { bool identity; std::size_t outputElementSize; void (*convertArray)(const void *in, std::size_t stride, std::size_t n, void *out); D3DDECLTYPE d3dDeclType; }; enum { NUM_GL_VERTEX_ATTRIB_TYPES = 6 }; FormatConverter mAttributeTypes[NUM_GL_VERTEX_ATTRIB_TYPES][2][4]; // [GL types as enumerated by typeIndex()][normalized][size - 1] struct TranslationDescription { DWORD capsFlag; FormatConverter preferredConversion; FormatConverter fallbackConversion; }; // This table is used to generate mAttributeTypes. static const TranslationDescription mPossibleTranslations[NUM_GL_VERTEX_ATTRIB_TYPES][2][4]; // [GL types as enumerated by typeIndex()][normalized][size - 1] void checkVertexCaps(DWORD declTypes); unsigned int typeIndex(GLenum type) const; const FormatConverter &formatConverter(const VertexAttribute &attribute) const; }; } #endif // LIBGLESV2_GEOMETRY_VERTEXDATAMANAGER_H_