blob: 89f582ba06dce88f574123e4b6b127af4a1e72fe [file] [log] [blame]
#ifndef _VKTTEXTURETESTUTIL_HPP
#define _VKTTEXTURETESTUTIL_HPP
/*------------------------------------------------------------------------
* Vulkan Conformance Tests
* ------------------------
*
* Copyright (c) 2016 The Khronos Group Inc.
* Copyright (c) 2016 Samsung Electronics Co., Ltd.
* Copyright (c) 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 Texture test utilities.
*
* About coordinates:
* + Quads consist of 2 triangles, rendered using explicit indices.
* + All TextureTestUtil functions and classes expect texture coordinates
* for quads to be specified in order (-1, -1), (-1, 1), (1, -1), (1, 1).
*//*--------------------------------------------------------------------*/
#include "tcuDefs.hpp"
#include "tcuSurface.hpp"
#include "vkDefs.hpp"
#include "vkTypeUtil.hpp"
#include "vktTestCase.hpp"
#include "gluShaderProgram.hpp"
#include "gluTextureTestUtil.hpp"
#include "deSharedPtr.hpp"
#include "../pipeline/vktPipelineImageUtil.hpp"
namespace vkt
{
namespace texture
{
namespace util
{
enum Program
{
PROGRAM_2D_FLOAT = 0,
PROGRAM_2D_INT,
PROGRAM_2D_UINT,
PROGRAM_2D_SHADOW,
PROGRAM_2D_FLOAT_BIAS,
PROGRAM_2D_INT_BIAS,
PROGRAM_2D_UINT_BIAS,
PROGRAM_2D_SHADOW_BIAS,
PROGRAM_1D_FLOAT,
PROGRAM_1D_INT,
PROGRAM_1D_UINT,
PROGRAM_1D_SHADOW,
PROGRAM_1D_FLOAT_BIAS,
PROGRAM_1D_INT_BIAS,
PROGRAM_1D_UINT_BIAS,
PROGRAM_1D_SHADOW_BIAS,
PROGRAM_CUBE_FLOAT,
PROGRAM_CUBE_INT,
PROGRAM_CUBE_UINT,
PROGRAM_CUBE_SHADOW,
PROGRAM_CUBE_FLOAT_BIAS,
PROGRAM_CUBE_INT_BIAS,
PROGRAM_CUBE_UINT_BIAS,
PROGRAM_CUBE_SHADOW_BIAS,
PROGRAM_1D_ARRAY_FLOAT,
PROGRAM_1D_ARRAY_INT,
PROGRAM_1D_ARRAY_UINT,
PROGRAM_1D_ARRAY_SHADOW,
PROGRAM_2D_ARRAY_FLOAT,
PROGRAM_2D_ARRAY_INT,
PROGRAM_2D_ARRAY_UINT,
PROGRAM_2D_ARRAY_SHADOW,
PROGRAM_3D_FLOAT,
PROGRAM_3D_INT,
PROGRAM_3D_UINT,
PROGRAM_3D_FLOAT_BIAS,
PROGRAM_3D_INT_BIAS,
PROGRAM_3D_UINT_BIAS,
PROGRAM_CUBE_ARRAY_FLOAT,
PROGRAM_CUBE_ARRAY_INT,
PROGRAM_CUBE_ARRAY_UINT,
PROGRAM_CUBE_ARRAY_SHADOW,
PROGRAM_BUFFER_FLOAT,
PROGRAM_BUFFER_INT,
PROGRAM_BUFFER_UINT,
PROGRAM_LAST
};
void initializePrograms (vk::SourceCollections& programCollection, glu::Precision texCoordPrecision, const std::vector<Program>& programs, const char* texCoordSwizzle = DE_NULL);
typedef de::SharedPtr<pipeline::TestTexture> TestTextureSp;
typedef de::SharedPtr<pipeline::TestTexture2D> TestTexture2DSp;
typedef de::SharedPtr<pipeline::TestTextureCube> TestTextureCubeSp;
typedef de::SharedPtr<pipeline::TestTexture2DArray> TestTexture2DArraySp;
typedef de::SharedPtr<pipeline::TestTexture3D> TestTexture3DSp;
class TextureBinding {
public:
enum Type
{
TYPE_NONE = 0,
TYPE_2D,
TYPE_CUBE_MAP,
TYPE_2D_ARRAY,
TYPE_3D,
TYPE_LAST
};
enum ImageBackingMode
{
IMAGE_BACKING_MODE_REGULAR = 0,
IMAGE_BACKING_MODE_SPARSE,
IMAGE_BACKING_MODE_LAST
};
TextureBinding (Context& context);
TextureBinding (Context& context, const TestTextureSp& textureData, const Type type,
const vk::VkImageAspectFlags aspectMask,
const ImageBackingMode backingMode = IMAGE_BACKING_MODE_REGULAR,
const vk::VkComponentMapping componentMapping = vk::makeComponentMappingRGBA());
vk::VkImage getImage (void) { return *m_textureImage; }
vk::VkImageView getImageView (void) { return *m_textureImageView; }
Type getType (void) { return m_type; }
const pipeline::TestTexture& getTestTexture (void) { return *m_textureData; }
void updateTextureViewMipLevels (deUint32 baseLevel, deUint32 maxLevel);
private:
TextureBinding (const TextureBinding&); // not allowed!
TextureBinding& operator= (const TextureBinding&); // not allowed!
void updateTextureData (const TestTextureSp& textureData, const Type type);
Context& m_context;
Type m_type;
ImageBackingMode m_backingMode;
TestTextureSp m_textureData;
vk::Move<vk::VkImage> m_textureImage;
de::MovePtr<vk::Allocation> m_textureImageMemory;
vk::Move<vk::VkImageView> m_textureImageView;
std::vector<de::SharedPtr<vk::Allocation> > m_allocations;
vk::VkImageAspectFlags m_aspectMask;
vk::VkComponentMapping m_componentMapping;
};
typedef de::SharedPtr<TextureBinding> TextureBindingSp;
class TextureRenderer
{
public:
TextureRenderer (Context& context, vk::VkSampleCountFlagBits sampleCount, deUint32 renderWidth, deUint32 renderHeight, vk::VkComponentMapping componentMapping = vk::makeComponentMappingRGBA());
~TextureRenderer (void);
void renderQuad (tcu::Surface& result, int texUnit, const float* texCoord, glu::TextureTestUtil::TextureType texType);
void renderQuad (tcu::Surface& result, int texUnit, const float* texCoord, const glu::TextureTestUtil::ReferenceParams& params);
void renderQuad (tcu::Surface& result,
const float* positions,
const int texUnit,
const float* texCoord,
const glu::TextureTestUtil::ReferenceParams& params,
const float maxAnisotropy);
void clearImage (vk::VkImage image);
void add2DTexture (const TestTexture2DSp& texture,
const vk::VkImageAspectFlags& aspectMask,
TextureBinding::ImageBackingMode backingMode = TextureBinding::IMAGE_BACKING_MODE_REGULAR);
const pipeline::TestTexture2D& get2DTexture (int textureIndex) const;
void addCubeTexture (const TestTextureCubeSp& texture,
const vk::VkImageAspectFlags& aspectMask,
TextureBinding::ImageBackingMode backingMode = TextureBinding::IMAGE_BACKING_MODE_REGULAR);
const pipeline::TestTextureCube& getCubeTexture (int textureIndex) const;
void add2DArrayTexture (const TestTexture2DArraySp& texture,
const vk::VkImageAspectFlags& aspectMask,
TextureBinding::ImageBackingMode backingMode = TextureBinding::IMAGE_BACKING_MODE_REGULAR);
const pipeline::TestTexture2DArray& get2DArrayTexture (int textureIndex) const;
void add3DTexture (const TestTexture3DSp& texture,
const vk::VkImageAspectFlags& aspectMask,
TextureBinding::ImageBackingMode backingMode = TextureBinding::IMAGE_BACKING_MODE_REGULAR);
const pipeline::TestTexture3D& get3DTexture (int textureIndex) const;
void setViewport (float viewportX, float viewportY, float viewportW, float viewportH);
TextureBinding* getTextureBinding (int textureIndex) const;
deUint32 getRenderWidth (void) const;
deUint32 getRenderHeight (void) const;
protected:
TextureRenderer (const TextureRenderer& other);
TextureRenderer& operator= (const TextureRenderer& other);
Context& m_context;
tcu::TestLog& m_log;
const deUint32 m_renderWidth;
const deUint32 m_renderHeight;
const vk::VkSampleCountFlagBits m_sampleCount;
const deBool m_multisampling;
const vk::VkFormat m_imageFormat;
const tcu::TextureFormat m_textureFormat;
vk::Move<vk::VkImage> m_image;
de::MovePtr<vk::Allocation> m_imageMemory;
vk::Move<vk::VkImageView> m_imageView;
vk::Move<vk::VkImage> m_resolvedImage;
de::MovePtr<vk::Allocation> m_resolvedImageMemory;
vk::Move<vk::VkImageView> m_resolvedImageView;
vk::Move<vk::VkCommandPool> m_commandPool;
vk::Move<vk::VkRenderPass> m_renderPass;
vk::Move<vk::VkFramebuffer> m_frameBuffer;
vk::Move<vk::VkDescriptorPool> m_descriptorPool;
vk::Move<vk::VkBuffer> m_uniformBuffer;
de::MovePtr<vk::Allocation> m_uniformBufferMemory;
const vk::VkDeviceSize m_uniformBufferSize;
vk::Move<vk::VkBuffer> m_vertexIndexBuffer;
de::MovePtr<vk::Allocation> m_vertexIndexBufferMemory;
static const vk::VkDeviceSize s_vertexIndexBufferSize;
static const deUint16 s_vertexIndices[6];
vk::Move<vk::VkBuffer> m_resultBuffer;
de::MovePtr<vk::Allocation> m_resultBufferMemory;
const vk::VkDeviceSize m_resultBufferSize;
std::vector<TextureBindingSp> m_textureBindings;
float m_viewportOffsetX;
float m_viewportOffsetY;
float m_viewportWidth;
float m_viewportHeight;
vk::VkComponentMapping m_componentMapping;
private:
vk::Move<vk::VkDescriptorSet> makeDescriptorSet (const vk::VkDescriptorPool descriptorPool, const vk::VkDescriptorSetLayout setLayout) const;
void addImageTransitionBarrier (vk::VkCommandBuffer commandBuffer, vk::VkImage image, vk::VkPipelineStageFlags srcStageMask, vk::VkPipelineStageFlags dstStageMask, vk::VkAccessFlags srcAccessMask, vk::VkAccessFlags dstAccessMask, vk::VkImageLayout oldLayout, vk::VkImageLayout newLayout) const;
};
tcu::Sampler createSampler (tcu::Sampler::WrapMode wrapU, tcu::Sampler::WrapMode wrapV, tcu::Sampler::WrapMode wrapW, tcu::Sampler::FilterMode minFilterMode, tcu::Sampler::FilterMode magFilterMode, bool normalizedCoords = true);
tcu::Sampler createSampler (tcu::Sampler::WrapMode wrapU, tcu::Sampler::WrapMode wrapV, tcu::Sampler::FilterMode minFilterMode, tcu::Sampler::FilterMode magFilterMode, bool normalizedCoords = true);
tcu::Sampler createSampler (tcu::Sampler::WrapMode wrapU, tcu::Sampler::FilterMode minFilterMode, tcu::Sampler::FilterMode magFilterMode, bool normalizedCoords = true);
TestTexture2DSp loadTexture2D (const tcu::Archive& archive, const std::vector<std::string>& filenames);
TestTextureCubeSp loadTextureCube (const tcu::Archive& archive, const std::vector<std::string>& filenames);
// Add checkTextureSupport() function specialization for your test parameters class/struct if you need to use checkSupport() functionality
template <typename T>
void checkTextureSupport (Context& context, const T& testParameters)
{
DE_UNREF(context);
DE_UNREF(testParameters);
}
template <typename INSTANCE_TYPE>
class TextureTestCase : public TestCase
{
public:
TextureTestCase (tcu::TestContext& context, const std::string& name, const std::string& description, const typename INSTANCE_TYPE::ParameterType& testParameters)
: TestCase (context, name, description)
, m_testsParameters (testParameters)
{}
virtual TestInstance* createInstance (Context& context) const
{
return new INSTANCE_TYPE(context, m_testsParameters);
}
virtual void initPrograms (vk::SourceCollections& programCollection) const
{
initializePrograms(programCollection, m_testsParameters.texCoordPrecision, m_testsParameters.programs);
}
virtual void checkSupport (Context& context) const
{
checkTextureSupport(context, m_testsParameters);
}
protected:
const typename INSTANCE_TYPE::ParameterType m_testsParameters;
};
struct TextureCommonTestCaseParameters
{
TextureCommonTestCaseParameters (void);
vk::VkSampleCountFlagBits sampleCount;
glu::Precision texCoordPrecision;
tcu::Sampler::FilterMode minFilter;
tcu::Sampler::FilterMode magFilter;
tcu::Sampler::WrapMode wrapS;
tcu::Sampler::WrapMode wrapT;
vk::VkFormat format;
std::vector<util::Program> programs;
deBool unnormal;
vk::VkImageAspectFlags aspectMask;
};
struct Texture2DTestCaseParameters : public TextureCommonTestCaseParameters
{
Texture2DTestCaseParameters (void);
int width;
int height;
bool mipmaps;
};
struct TextureCubeTestCaseParameters : public TextureCommonTestCaseParameters
{
TextureCubeTestCaseParameters (void);
int size;
};
struct Texture2DArrayTestCaseParameters : public Texture2DTestCaseParameters
{
Texture2DArrayTestCaseParameters(void);
int numLayers;
};
struct Texture3DTestCaseParameters : public Texture2DTestCaseParameters
{
Texture3DTestCaseParameters (void);
tcu::Sampler::WrapMode wrapR;
int depth;
};
} // util
} // texture
} // vkt
#endif // _VKTTEXTURETESTUTIL_HPP