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