You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

142 lines
3.9 KiB

#ifndef _ES31FMULTISAMPLESHADERRENDERCASE_HPP
#define _ES31FMULTISAMPLESHADERRENDERCASE_HPP
/*-------------------------------------------------------------------------
* drawElements Quality Program OpenGL ES 3.1 Module
* -------------------------------------------------
*
* 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 Multisample shader render case
*//*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
#include "tes31TestCase.hpp"
#include <map>
namespace tcu
{
class Surface;
} // tcu
namespace glu
{
class ShaderProgram;
} // glu
namespace deqp
{
namespace gles31
{
namespace Functional
{
namespace MultisampleShaderRenderUtil
{
class QualityWarning : public tcu::Exception
{
public:
QualityWarning (const std::string& message);
};
class MultisampleRenderCase : public TestCase
{
public:
enum RenderTarget
{
TARGET_DEFAULT = 0,
TARGET_TEXTURE,
TARGET_RENDERBUFFER,
TARGET_LAST
};
enum Flags
{
FLAG_PER_ITERATION_SHADER = 1,
FLAG_VERIFY_MSAA_TEXTURE_SAMPLE_BUFFERS = 2, // !< flag set: each sample layer is verified by verifySampleBuffer
};
MultisampleRenderCase (Context& context, const char* name, const char* desc, int numSamples, RenderTarget target, int renderSize, int flags = 0);
virtual ~MultisampleRenderCase (void);
virtual void init (void);
virtual void deinit (void);
IterateResult iterate (void);
private:
virtual void preDraw (void);
virtual void postDraw (void);
virtual void preTest (void);
virtual void postTest (void);
virtual std::string getIterationDescription (int iteration) const;
void drawOneIteration (void);
void verifyResultImageAndSetResult (const tcu::Surface& resultImage);
void verifyResultBuffersAndSetResult (const std::vector<tcu::Surface>& resultBuffers);
virtual std::string genVertexSource (int numTargetSamples) const;
virtual std::string genFragmentSource (int numTargetSamples) const = 0;
std::string genMSSamplerSource (int numTargetSamples) const;
std::string genMSTextureResolverSource (int numTargetSamples) const;
std::string genMSTextureLayerFetchSource (int numTargetSamples) const;
virtual bool verifyImage (const tcu::Surface& resultImage) = 0;
virtual bool verifySampleBuffers (const std::vector<tcu::Surface>& resultBuffers);
virtual void setupRenderData (void);
glw::GLint getMaxConformantSampleCount (glw::GLenum target, glw::GLenum internalFormat);
protected:
struct Attrib
{
int offset;
int stride;
};
const int m_numRequestedSamples;
const RenderTarget m_renderTarget;
const int m_renderSize;
const bool m_perIterationShader;
const bool m_verifyTextureSampleBuffers;
deInt32 m_numTargetSamples;
deUint32 m_buffer;
deUint32 m_resolveBuffer;
glu::ShaderProgram* m_program;
deUint32 m_fbo;
deUint32 m_fboTexture;
glu::ShaderProgram* m_textureSamplerProgram;
deUint32 m_fboRbo;
deUint32 m_resolveFbo;
deUint32 m_resolveFboTexture;
int m_iteration;
int m_numIterations;
deUint32 m_renderMode;
deInt32 m_renderCount;
deUint32 m_renderVao;
deUint32 m_resolveVao;
std::string m_renderSceneDescription;
std::map<std::string, Attrib> m_renderAttribs;
};
} // MultisampleShaderRenderUtil
} // Functional
} // gles31
} // deqp
#endif // _ES31FMULTISAMPLESHADERRENDERCASE_HPP