xref: /aosp_15_r20/external/deqp/framework/opengl/gluObjectWrapper.cpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
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 uint32_t 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,uint32_t object)58 ObjectWrapper::ObjectWrapper(const glw::Functions &gl, const ObjectTraits &traits, uint32_t 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     {"texture", &glw::Functions::genTextures, &glw::Functions::deleteTextures},
73     {"buffer", &glw::Functions::genBuffers, &glw::Functions::deleteBuffers},
74     {"renderbuffer", &glw::Functions::genRenderbuffers, &glw::Functions::deleteRenderbuffers},
75     {"framebuffer", &glw::Functions::genFramebuffers, &glw::Functions::deleteFramebuffers},
76     {"transform feedback", &glw::Functions::genTransformFeedbacks, &glw::Functions::deleteTransformFeedbacks},
77     {"vertex array", &glw::Functions::genVertexArrays, &glw::Functions::deleteVertexArrays},
78     {"query", &glw::Functions::genQueries, &glw::Functions::deleteQueries},
79     {"sampler", &glw::Functions::genSamplers, &glw::Functions::deleteSamplers},
80 };
81 
objectTraits(ObjectType type)82 const ObjectTraits &objectTraits(ObjectType type)
83 {
84     return de::getSizedArrayElement<OBJECTTYPE_LAST>(s_objectTraits, type);
85 }
86 
ObjectVector(const glw::Functions & gl,const ObjectTraits & traits,size_t numObjects)87 ObjectVector::ObjectVector(const glw::Functions &gl, const ObjectTraits &traits, size_t numObjects)
88     : m_gl(gl)
89     , m_traits(traits)
90 {
91     if (numObjects > 0)
92         resize(numObjects);
93 }
94 
~ObjectVector(void)95 ObjectVector::~ObjectVector(void)
96 {
97     clear();
98 }
99 
resize(size_t newSize)100 void ObjectVector::resize(size_t newSize)
101 {
102     const size_t oldSize = m_objects.size();
103 
104     if (newSize == 0)
105     {
106         clear(); // Avoid size_t (unsigned) overflow issues in delete path.
107     }
108     if (oldSize < newSize)
109     {
110         m_objects.resize(newSize, 0);
111         (m_gl.*m_traits.genFunc)(glw::GLsizei(newSize - oldSize), &m_objects[oldSize]);
112     }
113     else if (oldSize > newSize)
114     {
115         (m_gl.*m_traits.deleteFunc)(glw::GLsizei(oldSize - newSize), &m_objects[newSize]);
116         m_objects.resize(newSize);
117     }
118 }
119 
clear(void)120 void ObjectVector::clear(void)
121 {
122     (m_gl.*m_traits.deleteFunc)(glw::GLsizei(m_objects.size()), &m_objects.front());
123     m_objects.clear();
124 }
125 
126 } // namespace glu
127