#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 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 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 m_objects; } DE_WARN_UNUSED_TYPE; template 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 Texture; typedef TypedObjectWrapper Buffer; typedef TypedObjectWrapper Renderbuffer; typedef TypedObjectWrapper Framebuffer; typedef TypedObjectWrapper TransformFeedback; typedef TypedObjectWrapper VertexArray; typedef TypedObjectWrapper Query; typedef TypedObjectWrapper Sampler; typedef TypedObjectVector TextureVector; typedef TypedObjectVector BufferVector; typedef TypedObjectVector RenderbufferVector; } // glu #endif // _GLUOBJECTWRAPPER_HPP