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// IndexDataManager.h: Defines the IndexDataManager, a class that
16d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// runs the Buffer translation process for index buffers.
17d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
18d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#ifndef LIBGLES_CM_INDEXDATAMANAGER_H_
19d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#define LIBGLES_CM_INDEXDATAMANAGER_H_
20d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
21d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Context.h"
22d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
23d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include <GLES/gl.h>
24d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
25d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensnamespace es1
26d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{
27d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
28d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensstruct TranslatedIndexData
29d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{
30d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	unsigned int minIndex;
31d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	unsigned int maxIndex;
32d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	unsigned int indexOffset;
33d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
34d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	sw::Resource *indexBuffer;
35d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens};
36d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
37d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensclass StreamingIndexBuffer
38d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{
39d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capenspublic:
40d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	StreamingIndexBuffer(unsigned int initialSize);
41d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual ~StreamingIndexBuffer();
42d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
43d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void *map(unsigned int requiredSpace, unsigned int *offset);
44d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void unmap();
45d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void reserveSpace(unsigned int requiredSpace, GLenum type);
46d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
47d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	sw::Resource *getResource() const;
48d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
49d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensprivate:
50d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	sw::Resource *mIndexBuffer;
51d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	unsigned int mBufferSize;
52d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	unsigned int mWritePosition;
53d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens};
54d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
55d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensclass IndexDataManager
56d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{
57d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capenspublic:
58d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	IndexDataManager();
59d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual ~IndexDataManager();
60d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
61d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum prepareIndexData(GLenum type, GLsizei count, Buffer *arrayElementBuffer, const void *indices, TranslatedIndexData *translated);
62d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
63d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	static std::size_t typeSize(GLenum type);
64d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
65d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensprivate:
66d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	StreamingIndexBuffer *mStreamingBuffer;
67d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens};
68d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
69d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens}
70d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
71d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#endif   // LIBGLES_CM_INDEXDATAMANAGER_H_
72