#ifndef _SGLRGLCONTEXT_HPP #define _SGLRGLCONTEXT_HPP /*------------------------------------------------------------------------- * drawElements Quality Program OpenGL ES Utilities * ------------------------------------------------ * * Copyright 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * *//*! * \file * \brief GL Rendering Context. *//*--------------------------------------------------------------------*/ #include "tcuDefs.hpp" #include "sglrContext.hpp" #include "tcuTestLog.hpp" #include "tcuVector.hpp" #include "gluRenderContext.hpp" #include "gluShaderProgram.hpp" #include #include namespace glu { class CallLogWrapper; } namespace sglr { enum GLContextLogFlag { GLCONTEXT_LOG_CALLS = (1 << 0), GLCONTEXT_LOG_PROGRAMS = (1 << 1) }; class GLContext : public Context { public: GLContext(const glu::RenderContext &context, tcu::TestLog &log, uint32_t logFlags, const tcu::IVec4 &baseViewport); virtual ~GLContext(void); void enableLogging(uint32_t logFlags); virtual int getWidth(void) const; virtual int getHeight(void) const; virtual void viewport(int x, int y, int width, int height); virtual void activeTexture(uint32_t texture); virtual void bindTexture(uint32_t target, uint32_t texture); virtual void genTextures(int numTextures, uint32_t *textures); virtual void deleteTextures(int numTextures, const uint32_t *textures); virtual void bindFramebuffer(uint32_t target, uint32_t framebuffer); virtual void genFramebuffers(int numFramebuffers, uint32_t *framebuffers); virtual void deleteFramebuffers(int numFramebuffers, const uint32_t *framebuffers); virtual void bindRenderbuffer(uint32_t target, uint32_t renderbuffer); virtual void genRenderbuffers(int numRenderbuffers, uint32_t *renderbuffers); virtual void deleteRenderbuffers(int numRenderbuffers, const uint32_t *renderbuffers); virtual void pixelStorei(uint32_t pname, int param); virtual void texImage1D(uint32_t target, int level, uint32_t internalFormat, int width, int border, uint32_t format, uint32_t type, const void *data); virtual void texImage2D(uint32_t target, int level, uint32_t internalFormat, int width, int height, int border, uint32_t format, uint32_t type, const void *data); virtual void texImage3D(uint32_t target, int level, uint32_t internalFormat, int width, int height, int depth, int border, uint32_t format, uint32_t type, const void *data); virtual void texSubImage1D(uint32_t target, int level, int xoffset, int width, uint32_t format, uint32_t type, const void *data); virtual void texSubImage2D(uint32_t target, int level, int xoffset, int yoffset, int width, int height, uint32_t format, uint32_t type, const void *data); virtual void texSubImage3D(uint32_t target, int level, int xoffset, int yoffset, int zoffset, int width, int height, int depth, uint32_t format, uint32_t type, const void *data); virtual void copyTexImage1D(uint32_t target, int level, uint32_t internalFormat, int x, int y, int width, int border); virtual void copyTexImage2D(uint32_t target, int level, uint32_t internalFormat, int x, int y, int width, int height, int border); virtual void copyTexSubImage1D(uint32_t target, int level, int xoffset, int x, int y, int width); virtual void copyTexSubImage2D(uint32_t target, int level, int xoffset, int yoffset, int x, int y, int width, int height); virtual void copyTexSubImage3D(uint32_t target, int level, int xoffset, int yoffset, int zoffset, int x, int y, int width, int height); virtual void texStorage2D(uint32_t target, int levels, uint32_t internalFormat, int width, int height); virtual void texStorage3D(uint32_t target, int levels, uint32_t internalFormat, int width, int height, int depth); virtual void texParameteri(uint32_t target, uint32_t pname, int value); virtual void framebufferTexture2D(uint32_t target, uint32_t attachment, uint32_t textarget, uint32_t texture, int level); virtual void framebufferTextureLayer(uint32_t target, uint32_t attachment, uint32_t texture, int level, int layer); virtual void framebufferRenderbuffer(uint32_t target, uint32_t attachment, uint32_t renderbuffertarget, uint32_t renderbuffer); virtual uint32_t checkFramebufferStatus(uint32_t target); virtual void getFramebufferAttachmentParameteriv(uint32_t target, uint32_t attachment, uint32_t pname, int *params); virtual void renderbufferStorage(uint32_t target, uint32_t internalformat, int width, int height); virtual void renderbufferStorageMultisample(uint32_t target, int samples, uint32_t internalFormat, int width, int height); virtual void bindBuffer(uint32_t target, uint32_t buffer); virtual void genBuffers(int numBuffers, uint32_t *buffers); virtual void deleteBuffers(int numBuffers, const uint32_t *buffers); virtual void bufferData(uint32_t target, intptr_t size, const void *data, uint32_t usage); virtual void bufferSubData(uint32_t target, intptr_t offset, intptr_t size, const void *data); virtual void clearColor(float red, float green, float blue, float alpha); virtual void clearDepthf(float depth); virtual void clearStencil(int stencil); virtual void clear(uint32_t buffers); virtual void clearBufferiv(uint32_t buffer, int drawbuffer, const int *value); virtual void clearBufferfv(uint32_t buffer, int drawbuffer, const float *value); virtual void clearBufferuiv(uint32_t buffer, int drawbuffer, const uint32_t *value); virtual void clearBufferfi(uint32_t buffer, int drawbuffer, float depth, int stencil); virtual void scissor(int x, int y, int width, int height); virtual void enable(uint32_t cap); virtual void disable(uint32_t cap); virtual void stencilFunc(uint32_t func, int ref, uint32_t mask); virtual void stencilOp(uint32_t sfail, uint32_t dpfail, uint32_t dppass); virtual void stencilFuncSeparate(uint32_t face, uint32_t func, int ref, uint32_t mask); virtual void stencilOpSeparate(uint32_t face, uint32_t sfail, uint32_t dpfail, uint32_t dppass); virtual void depthFunc(uint32_t func); virtual void depthRangef(float n, float f); virtual void depthRange(double n, double f); virtual void polygonOffset(float factor, float units); virtual void provokingVertex(uint32_t convention); virtual void primitiveRestartIndex(uint32_t index); virtual void blendEquation(uint32_t mode); virtual void blendEquationSeparate(uint32_t modeRGB, uint32_t modeAlpha); virtual void blendFunc(uint32_t src, uint32_t dst); virtual void blendFuncSeparate(uint32_t srcRGB, uint32_t dstRGB, uint32_t srcAlpha, uint32_t dstAlpha); virtual void blendColor(float red, float green, float blue, float alpha); virtual void colorMask(bool r, bool g, bool b, bool a); virtual void depthMask(bool mask); virtual void stencilMask(uint32_t mask); virtual void stencilMaskSeparate(uint32_t face, uint32_t mask); virtual void blitFramebuffer(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, uint32_t mask, uint32_t filter); virtual void invalidateSubFramebuffer(uint32_t target, int numAttachments, const uint32_t *attachments, int x, int y, int width, int height); virtual void invalidateFramebuffer(uint32_t target, int numAttachments, const uint32_t *attachments); virtual void bindVertexArray(uint32_t array); virtual void genVertexArrays(int numArrays, uint32_t *vertexArrays); virtual void deleteVertexArrays(int numArrays, const uint32_t *vertexArrays); virtual void vertexAttribPointer(uint32_t index, int size, uint32_t type, bool normalized, int stride, const void *pointer); virtual void vertexAttribIPointer(uint32_t index, int size, uint32_t type, int stride, const void *pointer); virtual void enableVertexAttribArray(uint32_t index); virtual void disableVertexAttribArray(uint32_t index); virtual void vertexAttribDivisor(uint32_t index, uint32_t divisor); virtual void vertexAttrib1f(uint32_t index, float); virtual void vertexAttrib2f(uint32_t index, float, float); virtual void vertexAttrib3f(uint32_t index, float, float, float); virtual void vertexAttrib4f(uint32_t index, float, float, float, float); virtual void vertexAttribI4i(uint32_t index, int32_t, int32_t, int32_t, int32_t); virtual void vertexAttribI4ui(uint32_t index, uint32_t, uint32_t, uint32_t, uint32_t); virtual int32_t getAttribLocation(uint32_t program, const char *name); virtual void uniform1f(int32_t location, float); virtual void uniform1i(int32_t location, int32_t); virtual void uniform1fv(int32_t index, int32_t count, const float *); virtual void uniform2fv(int32_t index, int32_t count, const float *); virtual void uniform3fv(int32_t index, int32_t count, const float *); virtual void uniform4fv(int32_t index, int32_t count, const float *); virtual void uniform1iv(int32_t index, int32_t count, const int32_t *); virtual void uniform2iv(int32_t index, int32_t count, const int32_t *); virtual void uniform3iv(int32_t index, int32_t count, const int32_t *); virtual void uniform4iv(int32_t index, int32_t count, const int32_t *); virtual void uniformMatrix3fv(int32_t location, int32_t count, bool transpose, const float *value); virtual void uniformMatrix4fv(int32_t location, int32_t count, bool transpose, const float *value); virtual int32_t getUniformLocation(uint32_t program, const char *name); virtual void lineWidth(float); virtual void drawArrays(uint32_t mode, int first, int count); virtual void drawArraysInstanced(uint32_t mode, int first, int count, int instanceCount); virtual void drawElements(uint32_t mode, int count, uint32_t type, const void *indices); virtual void drawElementsInstanced(uint32_t mode, int count, uint32_t type, const void *indices, int instanceCount); virtual void drawElementsBaseVertex(uint32_t mode, int count, uint32_t type, const void *indices, int baseVertex); virtual void drawElementsInstancedBaseVertex(uint32_t mode, int count, uint32_t type, const void *indices, int instanceCount, int baseVertex); virtual void drawRangeElements(uint32_t mode, uint32_t start, uint32_t end, int count, uint32_t type, const void *indices); virtual void drawRangeElementsBaseVertex(uint32_t mode, uint32_t start, uint32_t end, int count, uint32_t type, const void *indices, int baseVertex); virtual void drawArraysIndirect(uint32_t mode, const void *indirect); virtual void drawElementsIndirect(uint32_t mode, uint32_t type, const void *indirect); virtual void multiDrawArrays(uint32_t mode, const int *first, const int *count, int primCount); virtual void multiDrawElements(uint32_t mode, const int *count, uint32_t type, const void **indices, int primCount); virtual void multiDrawElementsBaseVertex(uint32_t mode, const int *count, uint32_t type, const void **indices, int primCount, const int *baseVertex); virtual uint32_t createProgram(ShaderProgram *); virtual void deleteProgram(uint32_t program); virtual void useProgram(uint32_t program); virtual void readPixels(int x, int y, int width, int height, uint32_t format, uint32_t type, void *data); virtual uint32_t getError(void); virtual void finish(void); virtual void getIntegerv(uint32_t pname, int *params); virtual const char *getString(uint32_t pname); // Expose helpers from Context. using Context::readPixels; using Context::texImage2D; using Context::texSubImage2D; private: GLContext(const GLContext &other); GLContext &operator=(const GLContext &other); tcu::IVec2 getReadOffset(void) const; tcu::IVec2 getDrawOffset(void) const; const glu::RenderContext &m_context; tcu::TestLog &m_log; uint32_t m_logFlags; tcu::IVec4 m_baseViewport; tcu::IVec4 m_curViewport; tcu::IVec4 m_curScissor; uint32_t m_readFramebufferBinding; uint32_t m_drawFramebufferBinding; glu::CallLogWrapper *m_wrapper; // For cleanup std::set m_allocatedTextures; std::set m_allocatedFbos; std::set m_allocatedRbos; std::set m_allocatedBuffers; std::set m_allocatedVaos; std::vector m_programs; } DE_WARN_UNUSED_TYPE; } // namespace sglr #endif // _SGLRGLCONTEXT_HPP