Home | History | Annotate | Download | only in opengl
      1 /*-------------------------------------------------------------------------
      2  * drawElements Quality Program OpenGL ES Utilities
      3  * ------------------------------------------------
      4  *
      5  * Copyright 2014 The Android Open Source Project
      6  *
      7  * Licensed under the Apache License, Version 2.0 (the "License");
      8  * you may not use this file except in compliance with the License.
      9  * You may obtain a copy of the License at
     10  *
     11  *      http://www.apache.org/licenses/LICENSE-2.0
     12  *
     13  * Unless required by applicable law or agreed to in writing, software
     14  * distributed under the License is distributed on an "AS IS" BASIS,
     15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     16  * See the License for the specific language governing permissions and
     17  * limitations under the License.
     18  *
     19  *//*!
     20  * \file
     21  * \brief Buffer object wrapper.
     22  *//*--------------------------------------------------------------------*/
     23 
     24 #include "gluObjectWrapper.hpp"
     25 #include "gluRenderContext.hpp"
     26 #include "gluStrUtil.hpp"
     27 #include "glwFunctions.hpp"
     28 #include "glwEnums.hpp"
     29 #include "deArrayUtil.hpp"
     30 
     31 #include <sstream>
     32 
     33 namespace glu
     34 {
     35 
     36 ObjectWrapper::ObjectWrapper (const glw::Functions& gl, const ObjectTraits& traits)
     37 	: m_gl		(gl)
     38 	, m_traits	(traits)
     39 	, m_object	(0)
     40 {
     41 	(gl.*traits.genFunc)(1, &m_object);
     42 
     43 	if (m_object == 0)
     44 	{
     45 		const deUint32		err			= gl.getError();
     46 		const char*			objectName	= traits.name;
     47 		std::ostringstream	msg;
     48 
     49 		msg << "Failed to create " << objectName << " object, got " << getErrorStr((int)err);
     50 
     51 		if (err == GL_OUT_OF_MEMORY)
     52 			throw OutOfMemoryError(msg.str());
     53 		else
     54 			throw Error((int)err, msg.str());
     55 	}
     56 }
     57 
     58 ObjectWrapper::ObjectWrapper (const glw::Functions& gl, const ObjectTraits& traits, deUint32 object)
     59 	: m_gl		(gl)
     60 	, m_traits	(traits)
     61 	, m_object	(object)
     62 {
     63 	DE_ASSERT(object != 0);
     64 }
     65 
     66 ObjectWrapper::~ObjectWrapper (void)
     67 {
     68 	(m_gl.*m_traits.deleteFunc)(1, &m_object);
     69 }
     70 
     71 static const ObjectTraits s_objectTraits[OBJECTTYPE_LAST] =
     72 {
     73 	{ "texture",			&glw::Functions::genTextures,			&glw::Functions::deleteTextures				},
     74 	{ "buffer",				&glw::Functions::genBuffers,			&glw::Functions::deleteBuffers				},
     75 	{ "renderbuffer",		&glw::Functions::genRenderbuffers,		&glw::Functions::deleteRenderbuffers		},
     76 	{ "framebuffer",		&glw::Functions::genFramebuffers,		&glw::Functions::deleteFramebuffers			},
     77 	{ "transform feedback",	&glw::Functions::genTransformFeedbacks,	&glw::Functions::deleteTransformFeedbacks	},
     78 	{ "vertex array",		&glw::Functions::genVertexArrays,		&glw::Functions::deleteVertexArrays			},
     79 	{ "query",				&glw::Functions::genQueries,			&glw::Functions::deleteQueries				},
     80 	{ "sampler",			&glw::Functions::genSamplers,			&glw::Functions::deleteSamplers				},
     81 };
     82 
     83 const ObjectTraits& objectTraits (ObjectType type)
     84 {
     85 	return de::getSizedArrayElement<OBJECTTYPE_LAST>(s_objectTraits, type);
     86 }
     87 
     88 ObjectVector::ObjectVector (const glw::Functions& gl, const ObjectTraits& traits, size_t numObjects)
     89 	: m_gl		(gl)
     90 	, m_traits	(traits)
     91 {
     92 	if (numObjects > 0)
     93 		resize(numObjects);
     94 }
     95 
     96 ObjectVector::~ObjectVector (void)
     97 {
     98 	clear();
     99 }
    100 
    101 void ObjectVector::resize (size_t newSize)
    102 {
    103 	const size_t oldSize = m_objects.size();
    104 
    105 	if (newSize == 0)
    106 	{
    107 		clear(); // Avoid size_t (unsigned) overflow issues in delete path.
    108 	}
    109 	if (oldSize < newSize)
    110 	{
    111 		m_objects.resize(newSize, 0);
    112 		(m_gl.*m_traits.genFunc)(glw::GLsizei(newSize - oldSize), &m_objects[oldSize]);
    113 	}
    114 	else if (oldSize > newSize)
    115 	{
    116 		(m_gl.*m_traits.deleteFunc)(glw::GLsizei(oldSize - newSize), &m_objects[newSize]);
    117 		m_objects.resize(newSize);
    118 	}
    119 }
    120 
    121 void ObjectVector::clear (void)
    122 {
    123 	(m_gl.*m_traits.deleteFunc)(glw::GLsizei(m_objects.size()), &m_objects.front());
    124 	m_objects.clear();
    125 }
    126 
    127 } // glu
    128