1e5c31af7Sopenharmony_ci#ifndef _ES3FFBOTESTUTIL_HPP 2e5c31af7Sopenharmony_ci#define _ES3FFBOTESTUTIL_HPP 3e5c31af7Sopenharmony_ci/*------------------------------------------------------------------------- 4e5c31af7Sopenharmony_ci * drawElements Quality Program OpenGL ES 3.0 Module 5e5c31af7Sopenharmony_ci * ------------------------------------------------- 6e5c31af7Sopenharmony_ci * 7e5c31af7Sopenharmony_ci * Copyright 2014 The Android Open Source Project 8e5c31af7Sopenharmony_ci * 9e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 10e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License. 11e5c31af7Sopenharmony_ci * You may obtain a copy of the License at 12e5c31af7Sopenharmony_ci * 13e5c31af7Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 14e5c31af7Sopenharmony_ci * 15e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 16e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 17e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and 19e5c31af7Sopenharmony_ci * limitations under the License. 20e5c31af7Sopenharmony_ci * 21e5c31af7Sopenharmony_ci *//*! 22e5c31af7Sopenharmony_ci * \file 23e5c31af7Sopenharmony_ci * \brief FBO test utilities. 24e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/ 25e5c31af7Sopenharmony_ci 26e5c31af7Sopenharmony_ci#include "tcuDefs.hpp" 27e5c31af7Sopenharmony_ci#include "sglrContext.hpp" 28e5c31af7Sopenharmony_ci#include "gluShaderUtil.hpp" 29e5c31af7Sopenharmony_ci#include "tcuTexture.hpp" 30e5c31af7Sopenharmony_ci#include "tcuMatrix.hpp" 31e5c31af7Sopenharmony_ci#include "tcuRenderTarget.hpp" 32e5c31af7Sopenharmony_ci 33e5c31af7Sopenharmony_ci#include <vector> 34e5c31af7Sopenharmony_ci 35e5c31af7Sopenharmony_cinamespace deqp 36e5c31af7Sopenharmony_ci{ 37e5c31af7Sopenharmony_cinamespace gles3 38e5c31af7Sopenharmony_ci{ 39e5c31af7Sopenharmony_cinamespace Functional 40e5c31af7Sopenharmony_ci{ 41e5c31af7Sopenharmony_cinamespace FboTestUtil 42e5c31af7Sopenharmony_ci{ 43e5c31af7Sopenharmony_ci 44e5c31af7Sopenharmony_ci// \todo [2012-04-29 pyry] Clean up and name as SglrUtil 45e5c31af7Sopenharmony_ci 46e5c31af7Sopenharmony_ci// Helper class for constructing DataType vectors. 47e5c31af7Sopenharmony_cistruct DataTypes 48e5c31af7Sopenharmony_ci{ 49e5c31af7Sopenharmony_ci std::vector<glu::DataType> vec; 50e5c31af7Sopenharmony_ci DataTypes& operator<< (glu::DataType type) { vec.push_back(type); return *this; } 51e5c31af7Sopenharmony_ci}; 52e5c31af7Sopenharmony_ci 53e5c31af7Sopenharmony_ci// Shaders. 54e5c31af7Sopenharmony_ci 55e5c31af7Sopenharmony_ciclass FlatColorShader : public sglr::ShaderProgram 56e5c31af7Sopenharmony_ci{ 57e5c31af7Sopenharmony_cipublic: 58e5c31af7Sopenharmony_ci FlatColorShader (glu::DataType outputType); 59e5c31af7Sopenharmony_ci ~FlatColorShader (void) {} 60e5c31af7Sopenharmony_ci 61e5c31af7Sopenharmony_ci void setColor (sglr::Context& context, deUint32 program, const tcu::Vec4& color); 62e5c31af7Sopenharmony_ci 63e5c31af7Sopenharmony_ci void shadeVertices (const rr::VertexAttrib* inputs, rr::VertexPacket* const* packets, const int numPackets) const; 64e5c31af7Sopenharmony_ci void shadeFragments (rr::FragmentPacket* packets, const int numPackets, const rr::FragmentShadingContext& context) const; 65e5c31af7Sopenharmony_ci 66e5c31af7Sopenharmony_ciprivate: 67e5c31af7Sopenharmony_ci const glu::DataType m_outputType; 68e5c31af7Sopenharmony_ci}; 69e5c31af7Sopenharmony_ci 70e5c31af7Sopenharmony_ciclass GradientShader : public sglr::ShaderProgram 71e5c31af7Sopenharmony_ci{ 72e5c31af7Sopenharmony_cipublic: 73e5c31af7Sopenharmony_ci GradientShader (glu::DataType outputType); 74e5c31af7Sopenharmony_ci ~GradientShader (void) {} 75e5c31af7Sopenharmony_ci 76e5c31af7Sopenharmony_ci void setGradient (sglr::Context& context, deUint32 program, const tcu::Vec4& gradientMin, const tcu::Vec4& gradientMax); 77e5c31af7Sopenharmony_ci 78e5c31af7Sopenharmony_ci void shadeVertices (const rr::VertexAttrib* inputs, rr::VertexPacket* const* packets, const int numPackets) const; 79e5c31af7Sopenharmony_ci void shadeFragments (rr::FragmentPacket* packets, const int numPackets, const rr::FragmentShadingContext& context) const; 80e5c31af7Sopenharmony_ci 81e5c31af7Sopenharmony_ciprivate: 82e5c31af7Sopenharmony_ci const glu::DataType m_outputType; 83e5c31af7Sopenharmony_ci}; 84e5c31af7Sopenharmony_ci 85e5c31af7Sopenharmony_ciclass Texture2DShader : public sglr::ShaderProgram 86e5c31af7Sopenharmony_ci{ 87e5c31af7Sopenharmony_cipublic: 88e5c31af7Sopenharmony_ci Texture2DShader (const DataTypes& samplerTypes, glu::DataType outputType, const tcu::Vec4& outScale = tcu::Vec4(1.0f), const tcu::Vec4& outBias = tcu::Vec4(0.0f)); 89e5c31af7Sopenharmony_ci ~Texture2DShader (void) {} 90e5c31af7Sopenharmony_ci 91e5c31af7Sopenharmony_ci void setUnit (int samplerNdx, int unitNdx); 92e5c31af7Sopenharmony_ci void setTexScaleBias (int samplerNdx, const tcu::Vec4& scale, const tcu::Vec4& bias); 93e5c31af7Sopenharmony_ci void setOutScaleBias (const tcu::Vec4& scale, const tcu::Vec4& bias); 94e5c31af7Sopenharmony_ci 95e5c31af7Sopenharmony_ci void setUniforms (sglr::Context& context, deUint32 program) const; 96e5c31af7Sopenharmony_ci 97e5c31af7Sopenharmony_ci void shadeVertices (const rr::VertexAttrib* inputs, rr::VertexPacket* const* packets, const int numPackets) const; 98e5c31af7Sopenharmony_ci void shadeFragments (rr::FragmentPacket* packets, const int numPackets, const rr::FragmentShadingContext& context) const; 99e5c31af7Sopenharmony_ci 100e5c31af7Sopenharmony_ciprivate: 101e5c31af7Sopenharmony_ci struct Input 102e5c31af7Sopenharmony_ci { 103e5c31af7Sopenharmony_ci int unitNdx; 104e5c31af7Sopenharmony_ci tcu::Vec4 scale; 105e5c31af7Sopenharmony_ci tcu::Vec4 bias; 106e5c31af7Sopenharmony_ci }; 107e5c31af7Sopenharmony_ci 108e5c31af7Sopenharmony_ci std::vector<Input> m_inputs; 109e5c31af7Sopenharmony_ci tcu::Vec4 m_outScale; 110e5c31af7Sopenharmony_ci tcu::Vec4 m_outBias; 111e5c31af7Sopenharmony_ci 112e5c31af7Sopenharmony_ci const glu::DataType m_outputType; 113e5c31af7Sopenharmony_ci}; 114e5c31af7Sopenharmony_ci 115e5c31af7Sopenharmony_ciclass TextureCubeShader : public sglr::ShaderProgram 116e5c31af7Sopenharmony_ci{ 117e5c31af7Sopenharmony_cipublic: 118e5c31af7Sopenharmony_ci TextureCubeShader (glu::DataType samplerType, glu::DataType outputType); 119e5c31af7Sopenharmony_ci ~TextureCubeShader (void) {} 120e5c31af7Sopenharmony_ci 121e5c31af7Sopenharmony_ci void setFace (tcu::CubeFace face); 122e5c31af7Sopenharmony_ci void setTexScaleBias (const tcu::Vec4& scale, const tcu::Vec4& bias); 123e5c31af7Sopenharmony_ci 124e5c31af7Sopenharmony_ci void setUniforms (sglr::Context& context, deUint32 program) const; 125e5c31af7Sopenharmony_ci 126e5c31af7Sopenharmony_ci void shadeVertices (const rr::VertexAttrib* inputs, rr::VertexPacket* const* packets, const int numPackets) const; 127e5c31af7Sopenharmony_ci void shadeFragments (rr::FragmentPacket* packets, const int numPackets, const rr::FragmentShadingContext& context) const; 128e5c31af7Sopenharmony_ci 129e5c31af7Sopenharmony_ciprivate: 130e5c31af7Sopenharmony_ci tcu::Mat3 m_coordMat; 131e5c31af7Sopenharmony_ci tcu::Vec4 m_texScale; 132e5c31af7Sopenharmony_ci tcu::Vec4 m_texBias; 133e5c31af7Sopenharmony_ci 134e5c31af7Sopenharmony_ci const glu::DataType m_outputType; 135e5c31af7Sopenharmony_ci}; 136e5c31af7Sopenharmony_ci 137e5c31af7Sopenharmony_ciclass Texture2DArrayShader : public sglr::ShaderProgram 138e5c31af7Sopenharmony_ci{ 139e5c31af7Sopenharmony_cipublic: 140e5c31af7Sopenharmony_ci Texture2DArrayShader (glu::DataType samplerType, glu::DataType outputType); 141e5c31af7Sopenharmony_ci ~Texture2DArrayShader (void) {} 142e5c31af7Sopenharmony_ci 143e5c31af7Sopenharmony_ci void setLayer (int layer); 144e5c31af7Sopenharmony_ci void setTexScaleBias (const tcu::Vec4& scale, const tcu::Vec4& bias); 145e5c31af7Sopenharmony_ci 146e5c31af7Sopenharmony_ci void setUniforms (sglr::Context& context, deUint32 program) const; 147e5c31af7Sopenharmony_ci 148e5c31af7Sopenharmony_ci void shadeVertices (const rr::VertexAttrib* inputs, rr::VertexPacket* const* packets, const int numPackets) const; 149e5c31af7Sopenharmony_ci void shadeFragments (rr::FragmentPacket* packets, const int numPackets, const rr::FragmentShadingContext& context) const; 150e5c31af7Sopenharmony_ci 151e5c31af7Sopenharmony_ciprivate: 152e5c31af7Sopenharmony_ci tcu::Vec4 m_texScale; 153e5c31af7Sopenharmony_ci tcu::Vec4 m_texBias; 154e5c31af7Sopenharmony_ci int m_layer; 155e5c31af7Sopenharmony_ci 156e5c31af7Sopenharmony_ci const glu::DataType m_outputType; 157e5c31af7Sopenharmony_ci}; 158e5c31af7Sopenharmony_ci 159e5c31af7Sopenharmony_ciclass Texture3DShader : public sglr::ShaderProgram 160e5c31af7Sopenharmony_ci{ 161e5c31af7Sopenharmony_cipublic: 162e5c31af7Sopenharmony_ci Texture3DShader (glu::DataType samplerType, glu::DataType outputType); 163e5c31af7Sopenharmony_ci ~Texture3DShader (void) {} 164e5c31af7Sopenharmony_ci 165e5c31af7Sopenharmony_ci void setDepth (float r); 166e5c31af7Sopenharmony_ci void setTexScaleBias (const tcu::Vec4& scale, const tcu::Vec4& bias); 167e5c31af7Sopenharmony_ci 168e5c31af7Sopenharmony_ci void setUniforms (sglr::Context& context, deUint32 program) const; 169e5c31af7Sopenharmony_ci 170e5c31af7Sopenharmony_ci void shadeVertices (const rr::VertexAttrib* inputs, rr::VertexPacket* const* packets, const int numPackets) const; 171e5c31af7Sopenharmony_ci void shadeFragments (rr::FragmentPacket* packets, const int numPackets, const rr::FragmentShadingContext& context) const; 172e5c31af7Sopenharmony_ci 173e5c31af7Sopenharmony_ciprivate: 174e5c31af7Sopenharmony_ci tcu::Vec4 m_texScale; 175e5c31af7Sopenharmony_ci tcu::Vec4 m_texBias; 176e5c31af7Sopenharmony_ci float m_depth; 177e5c31af7Sopenharmony_ci 178e5c31af7Sopenharmony_ci const glu::DataType m_outputType; 179e5c31af7Sopenharmony_ci}; 180e5c31af7Sopenharmony_ci 181e5c31af7Sopenharmony_ciclass DepthGradientShader : public sglr::ShaderProgram 182e5c31af7Sopenharmony_ci{ 183e5c31af7Sopenharmony_cipublic: 184e5c31af7Sopenharmony_ci DepthGradientShader (glu::DataType outputType); 185e5c31af7Sopenharmony_ci ~DepthGradientShader (void) {} 186e5c31af7Sopenharmony_ci 187e5c31af7Sopenharmony_ci void setUniforms (sglr::Context& context, deUint32 program, const float gradientMin, const float gradientMax, const tcu::Vec4& color); 188e5c31af7Sopenharmony_ci 189e5c31af7Sopenharmony_ci void shadeVertices (const rr::VertexAttrib* inputs, rr::VertexPacket* const* packets, const int numPackets) const; 190e5c31af7Sopenharmony_ci void shadeFragments (rr::FragmentPacket* packets, const int numPackets, const rr::FragmentShadingContext& context) const; 191e5c31af7Sopenharmony_ci 192e5c31af7Sopenharmony_ciprivate: 193e5c31af7Sopenharmony_ci const glu::DataType m_outputType; 194e5c31af7Sopenharmony_ci const sglr::UniformSlot& u_minGradient; 195e5c31af7Sopenharmony_ci const sglr::UniformSlot& u_maxGradient; 196e5c31af7Sopenharmony_ci const sglr::UniformSlot& u_color; 197e5c31af7Sopenharmony_ci}; 198e5c31af7Sopenharmony_ci 199e5c31af7Sopenharmony_ci// Framebuffer incomplete exception. 200e5c31af7Sopenharmony_ciclass FboIncompleteException : public tcu::TestError 201e5c31af7Sopenharmony_ci{ 202e5c31af7Sopenharmony_cipublic: 203e5c31af7Sopenharmony_ci FboIncompleteException (deUint32 reason, const char* file, int line); 204e5c31af7Sopenharmony_ci virtual ~FboIncompleteException (void) throw() {} 205e5c31af7Sopenharmony_ci 206e5c31af7Sopenharmony_ci deUint32 getReason (void) const { return m_reason; } 207e5c31af7Sopenharmony_ci 208e5c31af7Sopenharmony_ciprivate: 209e5c31af7Sopenharmony_ci deUint32 m_reason; 210e5c31af7Sopenharmony_ci}; 211e5c31af7Sopenharmony_ci 212e5c31af7Sopenharmony_ci// Utility functions. 213e5c31af7Sopenharmony_ci 214e5c31af7Sopenharmony_ciglu::DataType getFragmentOutputType (const tcu::TextureFormat& format); 215e5c31af7Sopenharmony_citcu::TextureFormat getFramebufferReadFormat (const tcu::TextureFormat& format); 216e5c31af7Sopenharmony_ci 217e5c31af7Sopenharmony_ciconst char* getFormatName (deUint32 format); 218e5c31af7Sopenharmony_ci 219e5c31af7Sopenharmony_civoid clearColorBuffer (sglr::Context& ctx, const tcu::TextureFormat& format, const tcu::Vec4& value); 220e5c31af7Sopenharmony_civoid readPixels (sglr::Context& ctx, tcu::Surface& dst, int x, int y, int width, int height, const tcu::TextureFormat& format, const tcu::Vec4& scale, const tcu::Vec4& bias); 221e5c31af7Sopenharmony_ci 222e5c31af7Sopenharmony_citcu::RGBA getFormatThreshold (const tcu::TextureFormat& format); 223e5c31af7Sopenharmony_citcu::RGBA getFormatThreshold (const deUint32 glFormat); 224e5c31af7Sopenharmony_ci 225e5c31af7Sopenharmony_citcu::RGBA getToSRGBConversionThreshold (const tcu::TextureFormat& src, const tcu::TextureFormat& dst); 226e5c31af7Sopenharmony_ci 227e5c31af7Sopenharmony_ci} // FboTestUtil 228e5c31af7Sopenharmony_ci} // Functional 229e5c31af7Sopenharmony_ci} // gles3 230e5c31af7Sopenharmony_ci} // deqp 231e5c31af7Sopenharmony_ci 232e5c31af7Sopenharmony_ci#endif // _ES3FFBOTESTUTIL_HPP 233