1 #ifndef _SGLRCONTEXT_HPP 2 #define _SGLRCONTEXT_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 Simplified GLES reference context. 24 *//*--------------------------------------------------------------------*/ 25 26 #include "tcuDefs.hpp" 27 #include "tcuSurface.hpp" 28 #include "gluRenderContext.hpp" 29 #include "sglrShaderProgram.hpp" 30 31 /*--------------------------------------------------------------------*//*! 32 * \brief Reference OpenGL API implementation 33 *//*--------------------------------------------------------------------*/ 34 namespace sglr 35 { 36 37 // Abstract drawing context with GL-style API 38 39 class Context 40 { 41 public: Context(glu::ContextType type)42 Context(glu::ContextType type) : m_type(type) 43 { 44 } ~Context(void)45 virtual ~Context(void) 46 { 47 } 48 49 virtual int getWidth(void) const = 0; 50 virtual int getHeight(void) const = 0; 51 52 virtual void activeTexture(uint32_t texture) = 0; 53 virtual void viewport(int x, int y, int width, int height) = 0; 54 55 virtual void bindTexture(uint32_t target, uint32_t texture) = 0; 56 virtual void genTextures(int numTextures, uint32_t *textures) = 0; 57 virtual void deleteTextures(int numTextures, const uint32_t *textures) = 0; 58 59 virtual void bindFramebuffer(uint32_t target, uint32_t framebuffer) = 0; 60 virtual void genFramebuffers(int numFramebuffers, uint32_t *framebuffers) = 0; 61 virtual void deleteFramebuffers(int numFramebuffers, const uint32_t *framebuffers) = 0; 62 63 virtual void bindRenderbuffer(uint32_t target, uint32_t renderbuffer) = 0; 64 virtual void genRenderbuffers(int numRenderbuffers, uint32_t *renderbuffers) = 0; 65 virtual void deleteRenderbuffers(int numRenderbuffers, const uint32_t *renderbuffers) = 0; 66 67 virtual void pixelStorei(uint32_t pname, int param) = 0; 68 virtual void texImage1D(uint32_t target, int level, uint32_t internalFormat, int width, int border, uint32_t format, 69 uint32_t type, const void *data) = 0; 70 virtual void texImage2D(uint32_t target, int level, uint32_t internalFormat, int width, int height, int border, 71 uint32_t format, uint32_t type, const void *data) = 0; 72 virtual void texImage3D(uint32_t target, int level, uint32_t internalFormat, int width, int height, int depth, 73 int border, uint32_t format, uint32_t type, const void *data) = 0; 74 virtual void texSubImage1D(uint32_t target, int level, int xoffset, int width, uint32_t format, uint32_t type, 75 const void *data) = 0; 76 virtual void texSubImage2D(uint32_t target, int level, int xoffset, int yoffset, int width, int height, 77 uint32_t format, uint32_t type, const void *data) = 0; 78 virtual void texSubImage3D(uint32_t target, int level, int xoffset, int yoffset, int zoffset, int width, int height, 79 int depth, uint32_t format, uint32_t type, const void *data) = 0; 80 virtual void copyTexImage1D(uint32_t target, int level, uint32_t internalFormat, int x, int y, int width, 81 int border) = 0; 82 virtual void copyTexImage2D(uint32_t target, int level, uint32_t internalFormat, int x, int y, int width, 83 int height, int border) = 0; 84 virtual void copyTexSubImage1D(uint32_t target, int level, int xoffset, int x, int y, int width) = 0; 85 virtual void copyTexSubImage2D(uint32_t target, int level, int xoffset, int yoffset, int x, int y, int width, 86 int height) = 0; 87 virtual void copyTexSubImage3D(uint32_t target, int level, int xoffset, int yoffset, int zoffset, int x, int y, 88 int width, int height) = 0; 89 90 virtual void texStorage2D(uint32_t target, int levels, uint32_t internalFormat, int width, int height) = 0; 91 virtual void texStorage3D(uint32_t target, int levels, uint32_t internalFormat, int width, int height, 92 int depth) = 0; 93 94 virtual void texParameteri(uint32_t target, uint32_t pname, int value) = 0; 95 96 virtual void framebufferTexture2D(uint32_t target, uint32_t attachment, uint32_t textarget, uint32_t texture, 97 int level) = 0; 98 virtual void framebufferTextureLayer(uint32_t target, uint32_t attachment, uint32_t texture, int level, 99 int layer) = 0; 100 virtual void framebufferRenderbuffer(uint32_t target, uint32_t attachment, uint32_t renderbuffertarget, 101 uint32_t renderbuffer) = 0; 102 virtual uint32_t checkFramebufferStatus(uint32_t target) = 0; 103 104 virtual void getFramebufferAttachmentParameteriv(uint32_t target, uint32_t attachment, uint32_t pname, 105 int *params) = 0; 106 107 virtual void renderbufferStorage(uint32_t target, uint32_t internalformat, int width, int height) = 0; 108 virtual void renderbufferStorageMultisample(uint32_t target, int samples, uint32_t internalFormat, int width, 109 int height) = 0; 110 111 virtual void bindBuffer(uint32_t target, uint32_t buffer) = 0; 112 virtual void genBuffers(int numBuffers, uint32_t *buffers) = 0; 113 virtual void deleteBuffers(int numBuffers, const uint32_t *buffers) = 0; 114 115 virtual void bufferData(uint32_t target, intptr_t size, const void *data, uint32_t usage) = 0; 116 virtual void bufferSubData(uint32_t target, intptr_t offset, intptr_t size, const void *data) = 0; 117 118 virtual void clearColor(float red, float green, float blue, float alpha) = 0; 119 virtual void clearDepthf(float depth) = 0; 120 virtual void clearStencil(int stencil) = 0; 121 122 virtual void clear(uint32_t buffers) = 0; 123 virtual void clearBufferiv(uint32_t buffer, int drawbuffer, const int *value) = 0; 124 virtual void clearBufferfv(uint32_t buffer, int drawbuffer, const float *value) = 0; 125 virtual void clearBufferuiv(uint32_t buffer, int drawbuffer, const uint32_t *value) = 0; 126 virtual void clearBufferfi(uint32_t buffer, int drawbuffer, float depth, int stencil) = 0; 127 virtual void scissor(int x, int y, int width, int height) = 0; 128 129 virtual void enable(uint32_t cap) = 0; 130 virtual void disable(uint32_t cap) = 0; 131 132 virtual void stencilFunc(uint32_t func, int ref, uint32_t mask) = 0; 133 virtual void stencilOp(uint32_t sfail, uint32_t dpfail, uint32_t dppass) = 0; 134 virtual void stencilFuncSeparate(uint32_t face, uint32_t func, int ref, uint32_t mask) = 0; 135 virtual void stencilOpSeparate(uint32_t face, uint32_t sfail, uint32_t dpfail, uint32_t dppass) = 0; 136 137 virtual void depthFunc(uint32_t func) = 0; 138 virtual void depthRangef(float n, float f) = 0; 139 virtual void depthRange(double n, double f) = 0; 140 141 virtual void polygonOffset(float factor, float units) = 0; 142 virtual void provokingVertex(uint32_t convention) = 0; 143 virtual void primitiveRestartIndex(uint32_t index) = 0; 144 145 virtual void blendEquation(uint32_t mode) = 0; 146 virtual void blendEquationSeparate(uint32_t modeRGB, uint32_t modeAlpha) = 0; 147 virtual void blendFunc(uint32_t src, uint32_t dst) = 0; 148 virtual void blendFuncSeparate(uint32_t srcRGB, uint32_t dstRGB, uint32_t srcAlpha, uint32_t dstAlpha) = 0; 149 virtual void blendColor(float red, float green, float blue, float alpha) = 0; 150 151 virtual void colorMask(bool r, bool g, bool b, bool a) = 0; 152 virtual void depthMask(bool mask) = 0; 153 virtual void stencilMask(uint32_t mask) = 0; 154 virtual void stencilMaskSeparate(uint32_t face, uint32_t mask) = 0; 155 156 virtual void blitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, 157 uint32_t mask, uint32_t filter) = 0; 158 159 virtual void invalidateSubFramebuffer(uint32_t target, int numAttachments, const uint32_t *attachments, int x, 160 int y, int width, int height) = 0; 161 virtual void invalidateFramebuffer(uint32_t target, int numAttachments, const uint32_t *attachments) = 0; 162 163 virtual void bindVertexArray(uint32_t array) = 0; 164 virtual void genVertexArrays(int numArrays, uint32_t *vertexArrays) = 0; 165 virtual void deleteVertexArrays(int numArrays, const uint32_t *vertexArrays) = 0; 166 167 virtual void vertexAttribPointer(uint32_t index, int size, uint32_t type, bool normalized, int stride, 168 const void *pointer) = 0; 169 virtual void vertexAttribIPointer(uint32_t index, int size, uint32_t type, int stride, const void *pointer) = 0; 170 virtual void enableVertexAttribArray(uint32_t index) = 0; 171 virtual void disableVertexAttribArray(uint32_t index) = 0; 172 virtual void vertexAttribDivisor(uint32_t index, uint32_t divisor) = 0; 173 174 virtual void vertexAttrib1f(uint32_t index, float) = 0; 175 virtual void vertexAttrib2f(uint32_t index, float, float) = 0; 176 virtual void vertexAttrib3f(uint32_t index, float, float, float) = 0; 177 virtual void vertexAttrib4f(uint32_t index, float, float, float, float) = 0; 178 virtual void vertexAttribI4i(uint32_t index, int32_t, int32_t, int32_t, int32_t) = 0; 179 virtual void vertexAttribI4ui(uint32_t index, uint32_t, uint32_t, uint32_t, uint32_t) = 0; 180 181 virtual int32_t getAttribLocation(uint32_t program, const char *name) = 0; 182 183 virtual void uniform1f(int32_t index, float) = 0; 184 virtual void uniform1i(int32_t index, int32_t) = 0; 185 virtual void uniform1fv(int32_t index, int32_t count, const float *) = 0; 186 virtual void uniform2fv(int32_t index, int32_t count, const float *) = 0; 187 virtual void uniform3fv(int32_t index, int32_t count, const float *) = 0; 188 virtual void uniform4fv(int32_t index, int32_t count, const float *) = 0; 189 virtual void uniform1iv(int32_t index, int32_t count, const int32_t *) = 0; 190 virtual void uniform2iv(int32_t index, int32_t count, const int32_t *) = 0; 191 virtual void uniform3iv(int32_t index, int32_t count, const int32_t *) = 0; 192 virtual void uniform4iv(int32_t index, int32_t count, const int32_t *) = 0; 193 virtual void uniformMatrix3fv(int32_t location, int32_t count, bool transpose, const float *value) = 0; 194 virtual void uniformMatrix4fv(int32_t location, int32_t count, bool transpose, const float *value) = 0; 195 virtual int32_t getUniformLocation(uint32_t program, const char *name) = 0; 196 197 virtual void lineWidth(float) = 0; 198 199 virtual void drawArrays(uint32_t mode, int first, int count) = 0; 200 virtual void drawArraysInstanced(uint32_t mode, int first, int count, int instanceCount) = 0; 201 virtual void drawElements(uint32_t mode, int count, uint32_t type, const void *indices) = 0; 202 virtual void drawElementsInstanced(uint32_t mode, int count, uint32_t type, const void *indices, 203 int instanceCount) = 0; 204 virtual void drawElementsBaseVertex(uint32_t mode, int count, uint32_t type, const void *indices, 205 int baseVertex) = 0; 206 virtual void drawElementsInstancedBaseVertex(uint32_t mode, int count, uint32_t type, const void *indices, 207 int instanceCount, int baseVertex) = 0; 208 virtual void drawRangeElements(uint32_t mode, uint32_t start, uint32_t end, int count, uint32_t type, 209 const void *indices) = 0; 210 virtual void drawRangeElementsBaseVertex(uint32_t mode, uint32_t start, uint32_t end, int count, uint32_t type, 211 const void *indices, int baseVertex) = 0; 212 virtual void drawArraysIndirect(uint32_t mode, const void *indirect) = 0; 213 virtual void drawElementsIndirect(uint32_t mode, uint32_t type, const void *indirect) = 0; 214 215 virtual void multiDrawArrays(uint32_t mode, const int *first, const int *count, int primCount) = 0; 216 virtual void multiDrawElements(uint32_t mode, const int *count, uint32_t type, const void **indices, 217 int primCount) = 0; 218 virtual void multiDrawElementsBaseVertex(uint32_t mode, const int *count, uint32_t type, const void **indices, 219 int primCount, const int *baseVertex) = 0; 220 221 virtual uint32_t createProgram(ShaderProgram *program) = 0; 222 virtual void useProgram(uint32_t program) = 0; 223 virtual void deleteProgram(uint32_t program) = 0; 224 225 virtual void readPixels(int x, int y, int width, int height, uint32_t format, uint32_t type, void *data) = 0; 226 virtual uint32_t getError(void) = 0; 227 virtual void finish(void) = 0; 228 229 virtual void getIntegerv(uint32_t pname, int *params) = 0; 230 virtual const char *getString(uint32_t pname) = 0; 231 232 // Helpers implemented by Context. 233 virtual void texImage2D(uint32_t target, int level, uint32_t internalFormat, const tcu::Surface &src); 234 virtual void texImage2D(uint32_t target, int level, uint32_t internalFormat, int width, int height); 235 virtual void texSubImage2D(uint32_t target, int level, int xoffset, int yoffset, const tcu::Surface &src); 236 virtual void readPixels(tcu::Surface &dst, int x, int y, int width, int height); 237 getType(void)238 glu::ContextType getType(void) 239 { 240 return m_type; 241 } 242 243 private: 244 const glu::ContextType m_type; 245 } DE_WARN_UNUSED_TYPE; 246 247 } // namespace sglr 248 249 #endif // _SGLRCONTEXT_HPP 250