1bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi//
3bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// Licensed under the Apache License, Version 2.0 (the "License");
4bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// you may not use this file except in compliance with the License.
5bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// You may obtain a copy of the License at
6bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi//
7bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi//    http://www.apache.org/licenses/LICENSE-2.0
8bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi//
9bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// Unless required by applicable law or agreed to in writing, software
10bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// distributed under the License is distributed on an "AS IS" BASIS,
11bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// See the License for the specific language governing permissions and
13bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// limitations under the License.
14bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi
15bbef5dff2b94fef72012e721cd6124cd87621af4Utkarsh Sanghi// IndexDataManager.h: Defines the IndexDataManager, a class that
1603d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn// runs the Buffer translation process for index buffers.
1703d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
1803d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn#ifndef LIBGL_INDEXDATAMANAGER_H_
1903d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn#define LIBGL_INDEXDATAMANAGER_H_
20ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahn
2103d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn#include "Context.h"
2203d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
2303d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn#define _GDI32_
2403d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn#include <windows.h>
2503d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn#include <GL/GL.h>
2603d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn#include <GL/glext.h>
2703d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
2803d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahnnamespace gl
2952e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn{
3052e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
3152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahnstruct TranslatedIndexData
3252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn{
3303d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn	unsigned int minIndex;
3403d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn	unsigned int maxIndex;
3552e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn	unsigned int indexOffset;
36bb692f29c1cdf929ba4eab680e96f7f14c228190Utkarsh Sanghi
37bb692f29c1cdf929ba4eab680e96f7f14c228190Utkarsh Sanghi	sw::Resource *indexBuffer;
3852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn};
3903d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
4003d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahnclass StreamingIndexBuffer
4103d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn{
4203d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahnpublic:
4303d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn	StreamingIndexBuffer(unsigned int initialSize);
44ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahn	virtual ~StreamingIndexBuffer();
4503d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
4603d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn	void *map(unsigned int requiredSpace, unsigned int *offset);
47ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahn	void unmap();
4809176c007d5a81b5bea472853669aa53caa570c2Utkarsh Sanghi	void reserveSpace(unsigned int requiredSpace, GLenum type);
49ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahn
5003d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn	sw::Resource *getResource() const;
5103d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
52ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahnprivate:
53ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahn	sw::Resource *mIndexBuffer;
54ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahn	unsigned int mBufferSize;
55ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahn	unsigned int mWritePosition;
5609176c007d5a81b5bea472853669aa53caa570c2Utkarsh Sanghi};
5709176c007d5a81b5bea472853669aa53caa570c2Utkarsh Sanghi
58ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahnclass IndexDataManager
59ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahn{
60ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahnpublic:
6166d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi	IndexDataManager();
6266d0d268e571647ca99a2bdf4835d967449d7ddeUtkarsh Sanghi	virtual ~IndexDataManager();
6303d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
6403d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn	GLenum prepareIndexData(GLenum type, GLsizei count, Buffer *arrayElementBuffer, const void *indices, TranslatedIndexData *translated);
6503d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn
6603d54dfbcbdd04384e8c0419b7c45282664a2c1aDarren Krahn	static std::size_t typeSize(GLenum type);
6752e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
6852e2a45f585fbe34032eae5b094a092afdf217caDarren Krahnprivate:
69ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahn	StreamingIndexBuffer *mStreamingBuffer;
70ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahn};
7152e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
7252e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn}
7352e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn
7452e2a45f585fbe34032eae5b094a092afdf217caDarren Krahn#endif   // LIBGL_INDEXDATAMANAGER_H_
75ce32afbb304bbca521ec0333b41c82d736295ec7Darren Krahn