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
ObjectWrapper(const glw::Functions & gl,const ObjectTraits & traits)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
ObjectWrapper(const glw::Functions & gl,const ObjectTraits & traits,deUint32 object)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
~ObjectWrapper(void)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
objectTraits(ObjectType type)83 const ObjectTraits& objectTraits (ObjectType type)
84 {
85 return de::getSizedArrayElement<OBJECTTYPE_LAST>(s_objectTraits, type);
86 }
87
ObjectVector(const glw::Functions & gl,const ObjectTraits & traits,size_t numObjects)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
~ObjectVector(void)96 ObjectVector::~ObjectVector (void)
97 {
98 clear();
99 }
100
resize(size_t newSize)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
clear(void)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