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 LIBGL_VERTEXDATAMANAGER_H_ 19#define LIBGL_VERTEXDATAMANAGER_H_ 20 21#include "Context.h" 22#include "Device.hpp" 23 24#define _GDI32_ 25#include <windows.h> 26#include <GL/GL.h> 27#include <GL/glext.h> 28 29namespace gl 30{ 31 32struct TranslatedAttribute 33{ 34 sw::StreamType type; 35 int count; 36 bool normalized; 37 38 unsigned int offset; 39 unsigned int stride; // 0 means not to advance the read pointer at all 40 41 sw::Resource *vertexBuffer; 42}; 43 44class VertexBuffer 45{ 46public: 47 VertexBuffer(unsigned int size); 48 virtual ~VertexBuffer(); 49 50 void unmap(); 51 52 sw::Resource *getResource() const; 53 54protected: 55 sw::Resource *mVertexBuffer; 56}; 57 58class ConstantVertexBuffer : public VertexBuffer 59{ 60public: 61 ConstantVertexBuffer(float x, float y, float z, float w); 62 ~ConstantVertexBuffer(); 63}; 64 65class StreamingVertexBuffer : public VertexBuffer 66{ 67public: 68 StreamingVertexBuffer(unsigned int size); 69 ~StreamingVertexBuffer(); 70 71 void *map(const VertexAttribute &attribute, unsigned int requiredSpace, unsigned int *streamOffset); 72 void reserveRequiredSpace(); 73 void addRequiredSpace(unsigned int requiredSpace); 74 75protected: 76 unsigned int mBufferSize; 77 unsigned int mWritePosition; 78 unsigned int mRequiredSpace; 79}; 80 81class VertexDataManager 82{ 83public: 84 VertexDataManager(Context *context); 85 virtual ~VertexDataManager(); 86 87 void dirtyCurrentValue(int index) { mDirtyCurrentValue[index] = true; } 88 89 GLenum prepareVertexData(GLint start, GLsizei count, TranslatedAttribute *outAttribs); 90 91private: 92 unsigned int writeAttributeData(StreamingVertexBuffer *vertexBuffer, GLint start, GLsizei count, const VertexAttribute &attribute); 93 94 Context *const mContext; 95 96 StreamingVertexBuffer *mStreamingBuffer; 97 98 bool mDirtyCurrentValue[MAX_VERTEX_ATTRIBS]; 99 ConstantVertexBuffer *mCurrentValueBuffer[MAX_VERTEX_ATTRIBS]; 100}; 101 102} 103 104#endif // LIBGL_VERTEXDATAMANAGER_H_ 105