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