// Copyright 2016 The SwiftShader Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // VertexDataManager.h: Defines the VertexDataManager, a class that // runs the Buffer translation process. #ifndef LIBGLESV2_VERTEXDATAMANAGER_H_ #define LIBGLESV2_VERTEXDATAMANAGER_H_ #include "Context.h" #include "Device.hpp" #include <GLES2/gl2.h> namespace es2 { 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, GLsizei instanceId); 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 // LIBGLESV2_VERTEXDATAMANAGER_H_