1 // 2 // Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 7 // VertexBuffer9.h: Defines the D3D9 VertexBuffer implementation. 8 9 #ifndef LIBGLESV2_RENDERER_VERTEXBUFFER9_H_ 10 #define LIBGLESV2_RENDERER_VERTEXBUFFER9_H_ 11 12 #include "libGLESv2/renderer/VertexBuffer.h" 13 14 namespace rx 15 { 16 class Renderer9; 17 18 class VertexBuffer9 : public VertexBuffer 19 { 20 public: 21 explicit VertexBuffer9(rx::Renderer9 *const renderer); 22 virtual ~VertexBuffer9(); 23 24 virtual bool initialize(unsigned int size, bool dynamicUsage); 25 26 static VertexBuffer9 *makeVertexBuffer9(VertexBuffer *vertexBuffer); 27 28 virtual bool storeVertexAttributes(const gl::VertexAttribute &attrib, GLint start, GLsizei count, GLsizei instances, 29 unsigned int offset); 30 virtual bool storeRawData(const void* data, unsigned int size, unsigned int offset); 31 32 virtual bool getSpaceRequired(const gl::VertexAttribute &attrib, GLsizei count, GLsizei instances, unsigned int *outSpaceRequired) const; 33 34 virtual bool requiresConversion(const gl::VertexAttribute &attrib) const; 35 36 unsigned int getVertexSize(const gl::VertexAttribute &attrib) const; 37 D3DDECLTYPE getDeclType(const gl::VertexAttribute &attrib) const; 38 39 virtual unsigned int getBufferSize() const; 40 virtual bool setBufferSize(unsigned int size); 41 virtual bool discard(); 42 43 IDirect3DVertexBuffer9 *getBuffer() const; 44 45 private: 46 DISALLOW_COPY_AND_ASSIGN(VertexBuffer9); 47 48 rx::Renderer9 *const mRenderer; 49 50 IDirect3DVertexBuffer9 *mVertexBuffer; 51 unsigned int mBufferSize; 52 bool mDynamicUsage; 53 54 // Attribute format conversion 55 enum { NUM_GL_VERTEX_ATTRIB_TYPES = 6 }; 56 57 struct FormatConverter 58 { 59 bool identity; 60 std::size_t outputElementSize; 61 void (*convertArray)(const void *in, std::size_t stride, std::size_t n, void *out); 62 D3DDECLTYPE d3dDeclType; 63 }; 64 65 static bool mTranslationsInitialized; 66 static void initializeTranslations(DWORD declTypes); 67 68 // [GL types as enumerated by typeIndex()][normalized][size - 1] 69 static FormatConverter mFormatConverters[NUM_GL_VERTEX_ATTRIB_TYPES][2][4]; 70 71 struct TranslationDescription 72 { 73 DWORD capsFlag; 74 FormatConverter preferredConversion; 75 FormatConverter fallbackConversion; 76 }; 77 78 // This table is used to generate mFormatConverters. 79 // [GL types as enumerated by typeIndex()][normalized][size - 1] 80 static const TranslationDescription mPossibleTranslations[NUM_GL_VERTEX_ATTRIB_TYPES][2][4]; 81 82 static unsigned int typeIndex(GLenum type); 83 static const FormatConverter &formatConverter(const gl::VertexAttribute &attribute); 84 85 static bool spaceRequired(const gl::VertexAttribute &attrib, std::size_t count, GLsizei instances, 86 unsigned int *outSpaceRequired); 87 }; 88 89 } 90 91 #endif // LIBGLESV2_RENDERER_VERTEXBUFFER9_H_ 92