1*35238bceSAndroid Build Coastguard Worker #ifndef _GLSFRAGMENTOPUTIL_HPP 2*35238bceSAndroid Build Coastguard Worker #define _GLSFRAGMENTOPUTIL_HPP 3*35238bceSAndroid Build Coastguard Worker /*------------------------------------------------------------------------- 4*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program OpenGL (ES) Module 5*35238bceSAndroid Build Coastguard Worker * ----------------------------------------------- 6*35238bceSAndroid Build Coastguard Worker * 7*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project 8*35238bceSAndroid Build Coastguard Worker * 9*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 10*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 11*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at 12*35238bceSAndroid Build Coastguard Worker * 13*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 14*35238bceSAndroid Build Coastguard Worker * 15*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 16*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 17*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 19*35238bceSAndroid Build Coastguard Worker * limitations under the License. 20*35238bceSAndroid Build Coastguard Worker * 21*35238bceSAndroid Build Coastguard Worker *//*! 22*35238bceSAndroid Build Coastguard Worker * \file 23*35238bceSAndroid Build Coastguard Worker * \brief Fragment operation test utilities. 24*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/ 25*35238bceSAndroid Build Coastguard Worker 26*35238bceSAndroid Build Coastguard Worker #include "tcuDefs.hpp" 27*35238bceSAndroid Build Coastguard Worker #include "gluShaderUtil.hpp" 28*35238bceSAndroid Build Coastguard Worker #include "tcuVector.hpp" 29*35238bceSAndroid Build Coastguard Worker #include "tcuTexture.hpp" 30*35238bceSAndroid Build Coastguard Worker #include "rrFragmentOperations.hpp" 31*35238bceSAndroid Build Coastguard Worker 32*35238bceSAndroid Build Coastguard Worker namespace glu 33*35238bceSAndroid Build Coastguard Worker { 34*35238bceSAndroid Build Coastguard Worker class ShaderProgram; 35*35238bceSAndroid Build Coastguard Worker class RenderContext; 36*35238bceSAndroid Build Coastguard Worker } // namespace glu 37*35238bceSAndroid Build Coastguard Worker 38*35238bceSAndroid Build Coastguard Worker namespace deqp 39*35238bceSAndroid Build Coastguard Worker { 40*35238bceSAndroid Build Coastguard Worker namespace gls 41*35238bceSAndroid Build Coastguard Worker { 42*35238bceSAndroid Build Coastguard Worker namespace FragmentOpUtil 43*35238bceSAndroid Build Coastguard Worker { 44*35238bceSAndroid Build Coastguard Worker 45*35238bceSAndroid Build Coastguard Worker struct Quad 46*35238bceSAndroid Build Coastguard Worker { 47*35238bceSAndroid Build Coastguard Worker tcu::Vec2 posA; 48*35238bceSAndroid Build Coastguard Worker tcu::Vec2 posB; 49*35238bceSAndroid Build Coastguard Worker 50*35238bceSAndroid Build Coastguard Worker // Normalized device coordinates (range [-1, 1]). 51*35238bceSAndroid Build Coastguard Worker // In order (A.x, A.y), (A.x, B.y), (B.x, A.y), (B.x, B.y) 52*35238bceSAndroid Build Coastguard Worker tcu::Vec4 color[4]; 53*35238bceSAndroid Build Coastguard Worker tcu::Vec4 color1[4]; 54*35238bceSAndroid Build Coastguard Worker float depth[4]; 55*35238bceSAndroid Build Coastguard Worker Quaddeqp::gls::FragmentOpUtil::Quad56*35238bceSAndroid Build Coastguard Worker Quad(void) : posA(-1.0f, -1.0f), posB(1.0f, 1.0f) 57*35238bceSAndroid Build Coastguard Worker { 58*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < DE_LENGTH_OF_ARRAY(depth); i++) 59*35238bceSAndroid Build Coastguard Worker depth[i] = 0.0f; 60*35238bceSAndroid Build Coastguard Worker } 61*35238bceSAndroid Build Coastguard Worker }; 62*35238bceSAndroid Build Coastguard Worker 63*35238bceSAndroid Build Coastguard Worker class QuadRenderer 64*35238bceSAndroid Build Coastguard Worker { 65*35238bceSAndroid Build Coastguard Worker public: 66*35238bceSAndroid Build Coastguard Worker QuadRenderer(const glu::RenderContext &context, glu::GLSLVersion glslVersion); 67*35238bceSAndroid Build Coastguard Worker ~QuadRenderer(void); 68*35238bceSAndroid Build Coastguard Worker 69*35238bceSAndroid Build Coastguard Worker void render(const Quad &quad) const; 70*35238bceSAndroid Build Coastguard Worker 71*35238bceSAndroid Build Coastguard Worker private: 72*35238bceSAndroid Build Coastguard Worker QuadRenderer(const QuadRenderer &other); // Not allowed! 73*35238bceSAndroid Build Coastguard Worker QuadRenderer &operator=(const QuadRenderer &other); // Not allowed! 74*35238bceSAndroid Build Coastguard Worker 75*35238bceSAndroid Build Coastguard Worker const glu::RenderContext &m_context; 76*35238bceSAndroid Build Coastguard Worker glu::ShaderProgram *m_program; 77*35238bceSAndroid Build Coastguard Worker int m_positionLoc; 78*35238bceSAndroid Build Coastguard Worker int m_colorLoc; 79*35238bceSAndroid Build Coastguard Worker int m_color1Loc; 80*35238bceSAndroid Build Coastguard Worker const bool m_blendFuncExt; 81*35238bceSAndroid Build Coastguard Worker }; 82*35238bceSAndroid Build Coastguard Worker 83*35238bceSAndroid Build Coastguard Worker struct IntegerQuad 84*35238bceSAndroid Build Coastguard Worker { 85*35238bceSAndroid Build Coastguard Worker tcu::IVec2 posA; 86*35238bceSAndroid Build Coastguard Worker tcu::IVec2 posB; 87*35238bceSAndroid Build Coastguard Worker 88*35238bceSAndroid Build Coastguard Worker // Viewport coordinates (depth in range [0, 1]). 89*35238bceSAndroid Build Coastguard Worker // In order (A.x, A.y), (A.x, B.y), (B.x, A.y), (B.x, B.y) 90*35238bceSAndroid Build Coastguard Worker tcu::Vec4 color[4]; 91*35238bceSAndroid Build Coastguard Worker tcu::Vec4 color1[4]; 92*35238bceSAndroid Build Coastguard Worker float depth[4]; 93*35238bceSAndroid Build Coastguard Worker IntegerQuaddeqp::gls::FragmentOpUtil::IntegerQuad94*35238bceSAndroid Build Coastguard Worker IntegerQuad(int windowWidth, int windowHeight) : posA(0, 0), posB(windowWidth - 1, windowHeight - 1) 95*35238bceSAndroid Build Coastguard Worker { 96*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < DE_LENGTH_OF_ARRAY(depth); i++) 97*35238bceSAndroid Build Coastguard Worker depth[i] = 0.0f; 98*35238bceSAndroid Build Coastguard Worker } 99*35238bceSAndroid Build Coastguard Worker IntegerQuaddeqp::gls::FragmentOpUtil::IntegerQuad100*35238bceSAndroid Build Coastguard Worker IntegerQuad(void) : posA(0, 0), posB(1, 1) 101*35238bceSAndroid Build Coastguard Worker { 102*35238bceSAndroid Build Coastguard Worker for (int i = 0; i < DE_LENGTH_OF_ARRAY(depth); i++) 103*35238bceSAndroid Build Coastguard Worker depth[i] = 0.0f; 104*35238bceSAndroid Build Coastguard Worker } 105*35238bceSAndroid Build Coastguard Worker }; 106*35238bceSAndroid Build Coastguard Worker 107*35238bceSAndroid Build Coastguard Worker class ReferenceQuadRenderer 108*35238bceSAndroid Build Coastguard Worker { 109*35238bceSAndroid Build Coastguard Worker public: 110*35238bceSAndroid Build Coastguard Worker ReferenceQuadRenderer(void); 111*35238bceSAndroid Build Coastguard Worker 112*35238bceSAndroid Build Coastguard Worker void render(const tcu::PixelBufferAccess &colorBuffer, const tcu::PixelBufferAccess &depthBuffer, 113*35238bceSAndroid Build Coastguard Worker const tcu::PixelBufferAccess &stencilBuffer, const IntegerQuad &quad, 114*35238bceSAndroid Build Coastguard Worker const rr::FragmentOperationState &state); 115*35238bceSAndroid Build Coastguard Worker 116*35238bceSAndroid Build Coastguard Worker private: 117*35238bceSAndroid Build Coastguard Worker enum 118*35238bceSAndroid Build Coastguard Worker { 119*35238bceSAndroid Build Coastguard Worker MAX_FRAGMENT_BUFFER_SIZE = 1024 120*35238bceSAndroid Build Coastguard Worker }; 121*35238bceSAndroid Build Coastguard Worker 122*35238bceSAndroid Build Coastguard Worker void flushFragmentBuffer(const rr::MultisamplePixelBufferAccess &colorBuffer, 123*35238bceSAndroid Build Coastguard Worker const rr::MultisamplePixelBufferAccess &depthBuffer, 124*35238bceSAndroid Build Coastguard Worker const rr::MultisamplePixelBufferAccess &stencilBuffer, rr::FaceType faceType, 125*35238bceSAndroid Build Coastguard Worker const rr::FragmentOperationState &state); 126*35238bceSAndroid Build Coastguard Worker 127*35238bceSAndroid Build Coastguard Worker rr::Fragment m_fragmentBuffer[MAX_FRAGMENT_BUFFER_SIZE]; 128*35238bceSAndroid Build Coastguard Worker float m_fragmentDepths[MAX_FRAGMENT_BUFFER_SIZE]; 129*35238bceSAndroid Build Coastguard Worker int m_fragmentBufferSize; 130*35238bceSAndroid Build Coastguard Worker 131*35238bceSAndroid Build Coastguard Worker rr::FragmentProcessor m_fragmentProcessor; 132*35238bceSAndroid Build Coastguard Worker }; 133*35238bceSAndroid Build Coastguard Worker 134*35238bceSAndroid Build Coastguard Worker // These functions take a normally-indexed 2d pixel buffer and return a pixel buffer access 135*35238bceSAndroid Build Coastguard Worker // that indexes the same memory area, but using the multisample indexing convention. 136*35238bceSAndroid Build Coastguard Worker tcu::PixelBufferAccess getMultisampleAccess(const tcu::PixelBufferAccess &original); 137*35238bceSAndroid Build Coastguard Worker tcu::ConstPixelBufferAccess getMultisampleAccess(const tcu::ConstPixelBufferAccess &original); 138*35238bceSAndroid Build Coastguard Worker 139*35238bceSAndroid Build Coastguard Worker } // namespace FragmentOpUtil 140*35238bceSAndroid Build Coastguard Worker } // namespace gls 141*35238bceSAndroid Build Coastguard Worker } // namespace deqp 142*35238bceSAndroid Build Coastguard Worker 143*35238bceSAndroid Build Coastguard Worker #endif // _GLSFRAGMENTOPUTIL_HPP 144