| /*------------------------------------------------------------------------- |
| * 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 Buffer object wrapper. |
| *//*--------------------------------------------------------------------*/ |
| |
| #include "gluObjectWrapper.hpp" |
| #include "gluRenderContext.hpp" |
| #include "gluStrUtil.hpp" |
| #include "glwFunctions.hpp" |
| #include "glwEnums.hpp" |
| #include "deArrayUtil.hpp" |
| |
| #include <sstream> |
| |
| namespace glu |
| { |
| |
| ObjectWrapper::ObjectWrapper (const glw::Functions& gl, const ObjectTraits& traits) |
| : m_gl (gl) |
| , m_traits (traits) |
| , m_object (0) |
| { |
| (gl.*traits.genFunc)(1, &m_object); |
| |
| if (m_object == 0) |
| { |
| const deUint32 err = gl.getError(); |
| const char* objectName = traits.name; |
| std::ostringstream msg; |
| |
| msg << "Failed to create " << objectName << " object, got " << getErrorStr((int)err); |
| |
| if (err == GL_OUT_OF_MEMORY) |
| throw OutOfMemoryError(msg.str()); |
| else |
| throw Error((int)err, msg.str()); |
| } |
| } |
| |
| ObjectWrapper::ObjectWrapper (const glw::Functions& gl, const ObjectTraits& traits, deUint32 object) |
| : m_gl (gl) |
| , m_traits (traits) |
| , m_object (object) |
| { |
| DE_ASSERT(object != 0); |
| } |
| |
| ObjectWrapper::~ObjectWrapper (void) |
| { |
| (m_gl.*m_traits.deleteFunc)(1, &m_object); |
| } |
| |
| static const ObjectTraits s_objectTraits[OBJECTTYPE_LAST] = |
| { |
| { "texture", &glw::Functions::genTextures, &glw::Functions::deleteTextures }, |
| { "buffer", &glw::Functions::genBuffers, &glw::Functions::deleteBuffers }, |
| { "renderbuffer", &glw::Functions::genRenderbuffers, &glw::Functions::deleteRenderbuffers }, |
| { "framebuffer", &glw::Functions::genFramebuffers, &glw::Functions::deleteFramebuffers }, |
| { "transform feedback", &glw::Functions::genTransformFeedbacks, &glw::Functions::deleteTransformFeedbacks }, |
| { "vertex array", &glw::Functions::genVertexArrays, &glw::Functions::deleteVertexArrays }, |
| { "query", &glw::Functions::genQueries, &glw::Functions::deleteQueries }, |
| { "sampler", &glw::Functions::genSamplers, &glw::Functions::deleteSamplers }, |
| }; |
| |
| const ObjectTraits& objectTraits (ObjectType type) |
| { |
| return de::getSizedArrayElement<OBJECTTYPE_LAST>(s_objectTraits, type); |
| } |
| |
| ObjectVector::ObjectVector (const glw::Functions& gl, const ObjectTraits& traits, size_t numObjects) |
| : m_gl (gl) |
| , m_traits (traits) |
| { |
| if (numObjects > 0) |
| resize(numObjects); |
| } |
| |
| ObjectVector::~ObjectVector (void) |
| { |
| clear(); |
| } |
| |
| void ObjectVector::resize (size_t newSize) |
| { |
| const size_t oldSize = m_objects.size(); |
| |
| if (newSize == 0) |
| { |
| clear(); // Avoid size_t (unsigned) overflow issues in delete path. |
| } |
| if (oldSize < newSize) |
| { |
| m_objects.resize(newSize, 0); |
| (m_gl.*m_traits.genFunc)(glw::GLsizei(newSize - oldSize), &m_objects[oldSize]); |
| } |
| else if (oldSize > newSize) |
| { |
| (m_gl.*m_traits.deleteFunc)(glw::GLsizei(oldSize - newSize), &m_objects[newSize]); |
| m_objects.resize(newSize); |
| } |
| } |
| |
| void ObjectVector::clear (void) |
| { |
| (m_gl.*m_traits.deleteFunc)(glw::GLsizei(m_objects.size()), &m_objects.front()); |
| m_objects.clear(); |
| } |
| |
| } // glu |