| #ifndef _GLUOBJECTWRAPPER_HPP |
| #define _GLUOBJECTWRAPPER_HPP |
| /*------------------------------------------------------------------------- |
| * drawElements Quality Program OpenGL ES Utilities |
| * ------------------------------------------------ |
| * |
| * Copyright 2014 The Android Open Source Project |
| * |
| * 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. |
| * |
| *//*! |
| * \file |
| * \brief API object wrapper. |
| *//*--------------------------------------------------------------------*/ |
| |
| #include "gluDefs.hpp" |
| #include "gluRenderContext.hpp" |
| #include "glwFunctions.hpp" |
| |
| #include <vector> |
| |
| namespace glu |
| { |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief API object type. |
| * |
| * API object type is used to choose allocation and deallocation routines |
| * for objects. |
| *//*--------------------------------------------------------------------*/ |
| enum ObjectType |
| { |
| OBJECTTYPE_TEXTURE = 0, |
| OBJECTTYPE_BUFFER, |
| OBJECTTYPE_RENDERBUFFER, |
| OBJECTTYPE_FRAMEBUFFER, |
| OBJECTTYPE_TRANSFORM_FEEDBACK, |
| OBJECTTYPE_VERTEX_ARRAY, |
| OBJECTTYPE_QUERY, |
| OBJECTTYPE_SAMPLER, |
| |
| OBJECTTYPE_LAST |
| }; |
| |
| struct ObjectTraits |
| { |
| const char* name; |
| glw::glGenBuffersFunc glw::Functions::*genFunc; |
| glw::glDeleteBuffersFunc glw::Functions::*deleteFunc; |
| }; |
| |
| const ObjectTraits& objectTraits (ObjectType type); |
| |
| class ObjectWrapper |
| { |
| public: |
| ObjectWrapper (const glw::Functions& gl, const ObjectTraits& traits); |
| ObjectWrapper (const glw::Functions& gl, const ObjectTraits& traits, deUint32 object); |
| ~ObjectWrapper (void); |
| |
| inline deUint32 get (void) const { return m_object; } |
| inline deUint32 operator* (void) const { return m_object; } |
| |
| protected: |
| const glw::Functions& m_gl; |
| const ObjectTraits& m_traits; |
| deUint32 m_object; |
| |
| private: |
| ObjectWrapper (const ObjectWrapper& other); |
| ObjectWrapper& operator= (const ObjectWrapper& other); |
| } DE_WARN_UNUSED_TYPE; |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief API object wrapper template. |
| *//*--------------------------------------------------------------------*/ |
| template<ObjectType Type> class TypedObjectWrapper : public ObjectWrapper |
| { |
| public: |
| TypedObjectWrapper (const glw::Functions& gl, deUint32 object) : ObjectWrapper(gl, objectTraits(Type), object) {} |
| explicit TypedObjectWrapper (const RenderContext& context) : ObjectWrapper(context.getFunctions(), objectTraits(Type)) {} |
| explicit TypedObjectWrapper (const glw::Functions& gl) : ObjectWrapper(gl, objectTraits(Type)) {} |
| } DE_WARN_UNUSED_TYPE; |
| |
| /*--------------------------------------------------------------------*//*! |
| * \brief API object vector. |
| *//*--------------------------------------------------------------------*/ |
| class ObjectVector |
| { |
| public: |
| ObjectVector (const glw::Functions& gl, const ObjectTraits& traits, size_t numObjects = 0); |
| ~ObjectVector (void); |
| |
| size_t size (void) const { return m_objects.size(); } |
| |
| void resize (size_t newSize); |
| void clear (void); |
| |
| bool empty (void) const { return m_objects.empty(); } |
| |
| deUint32 get (size_t ndx) const { return m_objects[ndx]; } |
| deUint32 operator[] (size_t ndx) const { return get(ndx); } |
| |
| private: |
| ObjectVector (const ObjectVector& other); |
| ObjectVector& operator= (const ObjectVector& other); |
| |
| const glw::Functions& m_gl; |
| const ObjectTraits& m_traits; |
| std::vector<deUint32> m_objects; |
| } DE_WARN_UNUSED_TYPE; |
| |
| template<ObjectType Type> class TypedObjectVector : public ObjectVector |
| { |
| public: |
| explicit TypedObjectVector (const RenderContext& context, size_t numObjects = 0) : ObjectVector(context.getFunctions(), objectTraits(Type), numObjects) {} |
| explicit TypedObjectVector (const glw::Functions& gl, size_t numObjects = 0) : ObjectVector(gl, objectTraits(Type), numObjects) {} |
| }; |
| |
| // Typedefs for simple wrappers without functionality. |
| |
| typedef TypedObjectWrapper<OBJECTTYPE_TEXTURE> Texture; |
| typedef TypedObjectWrapper<OBJECTTYPE_BUFFER> Buffer; |
| typedef TypedObjectWrapper<OBJECTTYPE_RENDERBUFFER> Renderbuffer; |
| typedef TypedObjectWrapper<OBJECTTYPE_FRAMEBUFFER> Framebuffer; |
| typedef TypedObjectWrapper<OBJECTTYPE_TRANSFORM_FEEDBACK> TransformFeedback; |
| typedef TypedObjectWrapper<OBJECTTYPE_VERTEX_ARRAY> VertexArray; |
| typedef TypedObjectWrapper<OBJECTTYPE_QUERY> Query; |
| typedef TypedObjectWrapper<OBJECTTYPE_SAMPLER> Sampler; |
| |
| typedef TypedObjectVector<OBJECTTYPE_TEXTURE> TextureVector; |
| typedef TypedObjectVector<OBJECTTYPE_BUFFER> BufferVector; |
| typedef TypedObjectVector<OBJECTTYPE_RENDERBUFFER> RenderbufferVector; |
| |
| } // glu |
| |
| #endif // _GLUOBJECTWRAPPER_HPP |