1// Copyright 2016 The SwiftShader Authors. All Rights Reserved. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15// VertexDataManager.h: Defines the VertexDataManager, a class that 16// runs the Buffer translation process. 17 18#ifndef LIBGLESV2_VERTEXDATAMANAGER_H_ 19#define LIBGLESV2_VERTEXDATAMANAGER_H_ 20 21#include "Context.h" 22#include "Device.hpp" 23 24#include <GLES2/gl2.h> 25 26namespace es2 27{ 28 29struct TranslatedAttribute 30{ 31 sw::StreamType type; 32 int count; 33 bool normalized; 34 35 unsigned int offset; 36 unsigned int stride; // 0 means not to advance the read pointer at all 37 38 sw::Resource *vertexBuffer; 39}; 40 41class VertexBuffer 42{ 43public: 44 VertexBuffer(unsigned int size); 45 virtual ~VertexBuffer(); 46 47 void unmap(); 48 49 sw::Resource *getResource() const; 50 51protected: 52 sw::Resource *mVertexBuffer; 53}; 54 55class ConstantVertexBuffer : public VertexBuffer 56{ 57public: 58 ConstantVertexBuffer(float x, float y, float z, float w); 59 ~ConstantVertexBuffer(); 60}; 61 62class StreamingVertexBuffer : public VertexBuffer 63{ 64public: 65 StreamingVertexBuffer(unsigned int size); 66 ~StreamingVertexBuffer(); 67 68 void *map(const VertexAttribute &attribute, unsigned int requiredSpace, unsigned int *streamOffset); 69 void reserveRequiredSpace(); 70 void addRequiredSpace(unsigned int requiredSpace); 71 72protected: 73 unsigned int mBufferSize; 74 unsigned int mWritePosition; 75 unsigned int mRequiredSpace; 76}; 77 78class VertexDataManager 79{ 80public: 81 VertexDataManager(Context *context); 82 virtual ~VertexDataManager(); 83 84 void dirtyCurrentValue(int index) { mDirtyCurrentValue[index] = true; } 85 86 GLenum prepareVertexData(GLint start, GLsizei count, TranslatedAttribute *outAttribs, GLsizei instanceId); 87 88private: 89 unsigned int writeAttributeData(StreamingVertexBuffer *vertexBuffer, GLint start, GLsizei count, const VertexAttribute &attribute); 90 91 Context *const mContext; 92 93 StreamingVertexBuffer *mStreamingBuffer; 94 95 bool mDirtyCurrentValue[MAX_VERTEX_ATTRIBS]; 96 ConstantVertexBuffer *mCurrentValueBuffer[MAX_VERTEX_ATTRIBS]; 97}; 98 99} 100 101#endif // LIBGLESV2_VERTEXDATAMANAGER_H_ 102