1 #ifndef _SGLRGLCONTEXT_HPP 2 #define _SGLRGLCONTEXT_HPP 3 /*------------------------------------------------------------------------- 4 * drawElements Quality Program OpenGL ES Utilities 5 * ------------------------------------------------ 6 * 7 * Copyright 2014 The Android Open Source Project 8 * 9 * Licensed under the Apache License, Version 2.0 (the "License"); 10 * you may not use this file except in compliance with the License. 11 * You may obtain a copy of the License at 12 * 13 * http://www.apache.org/licenses/LICENSE-2.0 14 * 15 * Unless required by applicable law or agreed to in writing, software 16 * distributed under the License is distributed on an "AS IS" BASIS, 17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18 * See the License for the specific language governing permissions and 19 * limitations under the License. 20 * 21 *//*! 22 * \file 23 * \brief GL Rendering Context. 24 *//*--------------------------------------------------------------------*/ 25 26 #include "tcuDefs.hpp" 27 #include "sglrContext.hpp" 28 #include "tcuTestLog.hpp" 29 #include "tcuVector.hpp" 30 #include "gluRenderContext.hpp" 31 #include "gluShaderProgram.hpp" 32 33 #include <set> 34 #include <vector> 35 36 namespace glu 37 { 38 class CallLogWrapper; 39 } 40 41 namespace sglr 42 { 43 44 enum GLContextLogFlag 45 { 46 GLCONTEXT_LOG_CALLS = (1 << 0), 47 GLCONTEXT_LOG_PROGRAMS = (1 << 1) 48 }; 49 50 class GLContext : public Context 51 { 52 public: 53 GLContext(const glu::RenderContext &context, tcu::TestLog &log, uint32_t logFlags, const tcu::IVec4 &baseViewport); 54 virtual ~GLContext(void); 55 56 void enableLogging(uint32_t logFlags); 57 58 virtual int getWidth(void) const; 59 virtual int getHeight(void) const; 60 61 virtual void viewport(int x, int y, int width, int height); 62 virtual void activeTexture(uint32_t texture); 63 64 virtual void bindTexture(uint32_t target, uint32_t texture); 65 virtual void genTextures(int numTextures, uint32_t *textures); 66 virtual void deleteTextures(int numTextures, const uint32_t *textures); 67 68 virtual void bindFramebuffer(uint32_t target, uint32_t framebuffer); 69 virtual void genFramebuffers(int numFramebuffers, uint32_t *framebuffers); 70 virtual void deleteFramebuffers(int numFramebuffers, const uint32_t *framebuffers); 71 72 virtual void bindRenderbuffer(uint32_t target, uint32_t renderbuffer); 73 virtual void genRenderbuffers(int numRenderbuffers, uint32_t *renderbuffers); 74 virtual void deleteRenderbuffers(int numRenderbuffers, const uint32_t *renderbuffers); 75 76 virtual void pixelStorei(uint32_t pname, int param); 77 virtual void texImage1D(uint32_t target, int level, uint32_t internalFormat, int width, int border, uint32_t format, 78 uint32_t type, const void *data); 79 virtual void texImage2D(uint32_t target, int level, uint32_t internalFormat, int width, int height, int border, 80 uint32_t format, uint32_t type, const void *data); 81 virtual void texImage3D(uint32_t target, int level, uint32_t internalFormat, int width, int height, int depth, 82 int border, uint32_t format, uint32_t type, const void *data); 83 virtual void texSubImage1D(uint32_t target, int level, int xoffset, int width, uint32_t format, uint32_t type, 84 const void *data); 85 virtual void texSubImage2D(uint32_t target, int level, int xoffset, int yoffset, int width, int height, 86 uint32_t format, uint32_t type, const void *data); 87 virtual void texSubImage3D(uint32_t target, int level, int xoffset, int yoffset, int zoffset, int width, int height, 88 int depth, uint32_t format, uint32_t type, const void *data); 89 virtual void copyTexImage1D(uint32_t target, int level, uint32_t internalFormat, int x, int y, int width, 90 int border); 91 virtual void copyTexImage2D(uint32_t target, int level, uint32_t internalFormat, int x, int y, int width, 92 int height, int border); 93 virtual void copyTexSubImage1D(uint32_t target, int level, int xoffset, int x, int y, int width); 94 virtual void copyTexSubImage2D(uint32_t target, int level, int xoffset, int yoffset, int x, int y, int width, 95 int height); 96 virtual void copyTexSubImage3D(uint32_t target, int level, int xoffset, int yoffset, int zoffset, int x, int y, 97 int width, int height); 98 99 virtual void texStorage2D(uint32_t target, int levels, uint32_t internalFormat, int width, int height); 100 virtual void texStorage3D(uint32_t target, int levels, uint32_t internalFormat, int width, int height, int depth); 101 102 virtual void texParameteri(uint32_t target, uint32_t pname, int value); 103 104 virtual void framebufferTexture2D(uint32_t target, uint32_t attachment, uint32_t textarget, uint32_t texture, 105 int level); 106 virtual void framebufferTextureLayer(uint32_t target, uint32_t attachment, uint32_t texture, int level, int layer); 107 virtual void framebufferRenderbuffer(uint32_t target, uint32_t attachment, uint32_t renderbuffertarget, 108 uint32_t renderbuffer); 109 virtual uint32_t checkFramebufferStatus(uint32_t target); 110 111 virtual void getFramebufferAttachmentParameteriv(uint32_t target, uint32_t attachment, uint32_t pname, int *params); 112 113 virtual void renderbufferStorage(uint32_t target, uint32_t internalformat, int width, int height); 114 virtual void renderbufferStorageMultisample(uint32_t target, int samples, uint32_t internalFormat, int width, 115 int height); 116 117 virtual void bindBuffer(uint32_t target, uint32_t buffer); 118 virtual void genBuffers(int numBuffers, uint32_t *buffers); 119 virtual void deleteBuffers(int numBuffers, const uint32_t *buffers); 120 121 virtual void bufferData(uint32_t target, intptr_t size, const void *data, uint32_t usage); 122 virtual void bufferSubData(uint32_t target, intptr_t offset, intptr_t size, const void *data); 123 124 virtual void clearColor(float red, float green, float blue, float alpha); 125 virtual void clearDepthf(float depth); 126 virtual void clearStencil(int stencil); 127 128 virtual void clear(uint32_t buffers); 129 virtual void clearBufferiv(uint32_t buffer, int drawbuffer, const int *value); 130 virtual void clearBufferfv(uint32_t buffer, int drawbuffer, const float *value); 131 virtual void clearBufferuiv(uint32_t buffer, int drawbuffer, const uint32_t *value); 132 virtual void clearBufferfi(uint32_t buffer, int drawbuffer, float depth, int stencil); 133 virtual void scissor(int x, int y, int width, int height); 134 135 virtual void enable(uint32_t cap); 136 virtual void disable(uint32_t cap); 137 138 virtual void stencilFunc(uint32_t func, int ref, uint32_t mask); 139 virtual void stencilOp(uint32_t sfail, uint32_t dpfail, uint32_t dppass); 140 virtual void stencilFuncSeparate(uint32_t face, uint32_t func, int ref, uint32_t mask); 141 virtual void stencilOpSeparate(uint32_t face, uint32_t sfail, uint32_t dpfail, uint32_t dppass); 142 143 virtual void depthFunc(uint32_t func); 144 virtual void depthRangef(float n, float f); 145 virtual void depthRange(double n, double f); 146 147 virtual void polygonOffset(float factor, float units); 148 virtual void provokingVertex(uint32_t convention); 149 virtual void primitiveRestartIndex(uint32_t index); 150 151 virtual void blendEquation(uint32_t mode); 152 virtual void blendEquationSeparate(uint32_t modeRGB, uint32_t modeAlpha); 153 virtual void blendFunc(uint32_t src, uint32_t dst); 154 virtual void blendFuncSeparate(uint32_t srcRGB, uint32_t dstRGB, uint32_t srcAlpha, uint32_t dstAlpha); 155 virtual void blendColor(float red, float green, float blue, float alpha); 156 157 virtual void colorMask(bool r, bool g, bool b, bool a); 158 virtual void depthMask(bool mask); 159 virtual void stencilMask(uint32_t mask); 160 virtual void stencilMaskSeparate(uint32_t face, uint32_t mask); 161 162 virtual void blitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, 163 uint32_t mask, uint32_t filter); 164 165 virtual void invalidateSubFramebuffer(uint32_t target, int numAttachments, const uint32_t *attachments, int x, 166 int y, int width, int height); 167 virtual void invalidateFramebuffer(uint32_t target, int numAttachments, const uint32_t *attachments); 168 169 virtual void bindVertexArray(uint32_t array); 170 virtual void genVertexArrays(int numArrays, uint32_t *vertexArrays); 171 virtual void deleteVertexArrays(int numArrays, const uint32_t *vertexArrays); 172 173 virtual void vertexAttribPointer(uint32_t index, int size, uint32_t type, bool normalized, int stride, 174 const void *pointer); 175 virtual void vertexAttribIPointer(uint32_t index, int size, uint32_t type, int stride, const void *pointer); 176 virtual void enableVertexAttribArray(uint32_t index); 177 virtual void disableVertexAttribArray(uint32_t index); 178 virtual void vertexAttribDivisor(uint32_t index, uint32_t divisor); 179 180 virtual void vertexAttrib1f(uint32_t index, float); 181 virtual void vertexAttrib2f(uint32_t index, float, float); 182 virtual void vertexAttrib3f(uint32_t index, float, float, float); 183 virtual void vertexAttrib4f(uint32_t index, float, float, float, float); 184 virtual void vertexAttribI4i(uint32_t index, int32_t, int32_t, int32_t, int32_t); 185 virtual void vertexAttribI4ui(uint32_t index, uint32_t, uint32_t, uint32_t, uint32_t); 186 187 virtual int32_t getAttribLocation(uint32_t program, const char *name); 188 189 virtual void uniform1f(int32_t location, float); 190 virtual void uniform1i(int32_t location, int32_t); 191 virtual void uniform1fv(int32_t index, int32_t count, const float *); 192 virtual void uniform2fv(int32_t index, int32_t count, const float *); 193 virtual void uniform3fv(int32_t index, int32_t count, const float *); 194 virtual void uniform4fv(int32_t index, int32_t count, const float *); 195 virtual void uniform1iv(int32_t index, int32_t count, const int32_t *); 196 virtual void uniform2iv(int32_t index, int32_t count, const int32_t *); 197 virtual void uniform3iv(int32_t index, int32_t count, const int32_t *); 198 virtual void uniform4iv(int32_t index, int32_t count, const int32_t *); 199 virtual void uniformMatrix3fv(int32_t location, int32_t count, bool transpose, const float *value); 200 virtual void uniformMatrix4fv(int32_t location, int32_t count, bool transpose, const float *value); 201 virtual int32_t getUniformLocation(uint32_t program, const char *name); 202 203 virtual void lineWidth(float); 204 205 virtual void drawArrays(uint32_t mode, int first, int count); 206 virtual void drawArraysInstanced(uint32_t mode, int first, int count, int instanceCount); 207 virtual void drawElements(uint32_t mode, int count, uint32_t type, const void *indices); 208 virtual void drawElementsInstanced(uint32_t mode, int count, uint32_t type, const void *indices, int instanceCount); 209 virtual void drawElementsBaseVertex(uint32_t mode, int count, uint32_t type, const void *indices, int baseVertex); 210 virtual void drawElementsInstancedBaseVertex(uint32_t mode, int count, uint32_t type, const void *indices, 211 int instanceCount, int baseVertex); 212 virtual void drawRangeElements(uint32_t mode, uint32_t start, uint32_t end, int count, uint32_t type, 213 const void *indices); 214 virtual void drawRangeElementsBaseVertex(uint32_t mode, uint32_t start, uint32_t end, int count, uint32_t type, 215 const void *indices, int baseVertex); 216 virtual void drawArraysIndirect(uint32_t mode, const void *indirect); 217 virtual void drawElementsIndirect(uint32_t mode, uint32_t type, const void *indirect); 218 219 virtual void multiDrawArrays(uint32_t mode, const int *first, const int *count, int primCount); 220 virtual void multiDrawElements(uint32_t mode, const int *count, uint32_t type, const void **indices, int primCount); 221 virtual void multiDrawElementsBaseVertex(uint32_t mode, const int *count, uint32_t type, const void **indices, 222 int primCount, const int *baseVertex); 223 224 virtual uint32_t createProgram(ShaderProgram *); 225 virtual void deleteProgram(uint32_t program); 226 virtual void useProgram(uint32_t program); 227 228 virtual void readPixels(int x, int y, int width, int height, uint32_t format, uint32_t type, void *data); 229 virtual uint32_t getError(void); 230 virtual void finish(void); 231 232 virtual void getIntegerv(uint32_t pname, int *params); 233 virtual const char *getString(uint32_t pname); 234 235 // Expose helpers from Context. 236 using Context::readPixels; 237 using Context::texImage2D; 238 using Context::texSubImage2D; 239 240 private: 241 GLContext(const GLContext &other); 242 GLContext &operator=(const GLContext &other); 243 244 tcu::IVec2 getReadOffset(void) const; 245 tcu::IVec2 getDrawOffset(void) const; 246 247 const glu::RenderContext &m_context; 248 tcu::TestLog &m_log; 249 250 uint32_t m_logFlags; 251 tcu::IVec4 m_baseViewport; 252 tcu::IVec4 m_curViewport; 253 tcu::IVec4 m_curScissor; 254 uint32_t m_readFramebufferBinding; 255 uint32_t m_drawFramebufferBinding; 256 257 glu::CallLogWrapper *m_wrapper; 258 259 // For cleanup 260 std::set<uint32_t> m_allocatedTextures; 261 std::set<uint32_t> m_allocatedFbos; 262 std::set<uint32_t> m_allocatedRbos; 263 std::set<uint32_t> m_allocatedBuffers; 264 std::set<uint32_t> m_allocatedVaos; 265 std::vector<glu::ShaderProgram *> m_programs; 266 } DE_WARN_UNUSED_TYPE; 267 268 } // namespace sglr 269 270 #endif // _SGLRGLCONTEXT_HPP 271