#ifndef _VKTSAMPLEVERIFIER_HPP #define _VKTSAMPLEVERIFIER_HPP /*------------------------------------------------------------------------- * Vulkan Conformance Tests * ------------------------ * * Copyright (c) 2016 Google Inc. * * 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 GPU image sample verification *//*--------------------------------------------------------------------*/ #include "vkDefs.hpp" #include "deUniquePtr.hpp" #include "deSharedPtr.hpp" #include "tcuFloatFormat.hpp" #include "tcuTexture.hpp" #include "tcuVector.hpp" #include #include #include namespace vkt { namespace texture { struct SampleArguments { tcu::Vec4 coord; tcu::Vec4 dPdx; tcu::Vec4 dPdy; float layer; float lod; float lodBias; float dRef; }; enum LookupLodMode { LOOKUP_LOD_MODE_DERIVATIVES = 0, LOOKUP_LOD_MODE_LOD, LOOKUP_LOD_MODE_LAST }; struct SampleLookupSettings { LookupLodMode lookupLodMode; bool hasLodBias; bool isProjective; }; enum WrappingMode { WRAPPING_MODE_REPEAT = 0, WRAPPING_MODE_MIRRORED_REPEAT, WRAPPING_MODE_CLAMP_TO_EDGE, WRAPPING_MODE_CLAMP_TO_BORDER, WRAPPING_MODE_MIRROR_CLAMP_TO_EDGE, WRAPPING_MODE_LAST }; struct SamplerParameters { vk::VkFilter magFilter; vk::VkFilter minFilter; vk::VkSamplerMipmapMode mipmapFilter; vk::VkSamplerAddressMode wrappingModeU; vk::VkSamplerAddressMode wrappingModeV; vk::VkSamplerAddressMode wrappingModeW; vk::VkBorderColor borderColor; float lodBias; float minLod; float maxLod; bool isUnnormalized; bool isCompare; }; enum ImgDim { IMG_DIM_INVALID = 0, IMG_DIM_1D, IMG_DIM_2D, IMG_DIM_3D, IMG_DIM_CUBE, IMG_DIM_LAST }; struct ImageViewParameters { ImgDim dim; vk::VkFormat format; tcu::IVec3 size; int levels; bool isArrayed; int arrayLayers; }; class SampleVerifier { public: SampleVerifier (const ImageViewParameters& imParams, const SamplerParameters& samplerParams, const SampleLookupSettings& sampleLookupSettings, int coordBits, int mipmapBits, const std::vector>& conversionPrecision, const std::vector>& filteringPrecision, const std::vector& levels); bool verifySample (const SampleArguments& args, const tcu::Vec4& result) const; bool verifySampleReport (const SampleArguments& args, const tcu::Vec4& result, std::string& report) const; private: bool verifySampleFiltered (const tcu::Vec4& result, const tcu::IVec3& baseTexelHi, const tcu::IVec3& baseTexelLo, const tcu::IVec3& texelGridOffsetHi, const tcu::IVec3& texelGridOffsetLo, int layer, int levelHi, const tcu::Vec2& lodFracBounds, vk::VkFilter filter, vk::VkSamplerMipmapMode mipmapFilter, std::ostream& report) const; bool verifySampleTexelGridCoords (const SampleArguments& args, const tcu::Vec4& result, const tcu::IVec3& gridCoordHi, const tcu::IVec3& gridCoordLo, const tcu::Vec2& lodBounds, int level, vk::VkSamplerMipmapMode mipmapFilter, std::ostream& report) const; bool verifySampleMipmapLevel (const SampleArguments& args, const tcu::Vec4& result, const tcu::Vec4& coord, const tcu::Vec2& lodFracBounds, int level, std::ostream& report) const; bool verifySampleCubemapFace (const SampleArguments& args, const tcu::Vec4& result, const tcu::Vec4& coord, const tcu::Vec4& dPdx, const tcu::Vec4& dPdy, int face, std::ostream& report) const; bool verifySampleImpl (const SampleArguments& args, const tcu::Vec4& result, std::ostream& report) const; bool coordOutOfRange (const tcu::IVec3& coord, int compNdx, int level) const; void fetchTexel (const tcu::IVec3& coordIn, int layer, int level, vk::VkFilter filter, tcu::Vec4& resultMin, tcu::Vec4& resultMax) const; void fetchTexelWrapped (const tcu::IVec3& coord, int layer, int level, tcu::Vec4& resultMin, tcu::Vec4& resultMax) const; void getFilteredSample1D (const tcu::IVec3& texelBase, float weight, int layer, int level, tcu::Vec4& resultMin, tcu::Vec4& resultMax) const; void getFilteredSample2D (const tcu::IVec3& texelBase, const tcu::Vec2& weights, int layer, int level, tcu::Vec4& resultMin, tcu::Vec4& resultMax) const; void getFilteredSample3D (const tcu::IVec3& texelBase, const tcu::Vec3& weights, int layer, int level, tcu::Vec4& resultMin, tcu::Vec4& resultMax) const; void getFilteredSample (const tcu::IVec3& texelBase, const tcu::Vec3& weights, int layer, int level, tcu::Vec4& resultMin, tcu::Vec4& resultMax) const; void getMipmapStepBounds (const tcu::Vec2& lodFracBounds, deInt32& stepMin, deInt32& stepMax) const; const ImageViewParameters& m_imParams; const SamplerParameters& m_samplerParams; const SampleLookupSettings& m_sampleLookupSettings; const int m_coordBits; const int m_mipmapBits; const std::vector> m_conversionPrecision; const std::vector> m_filteringPrecision; const int m_unnormalizedDim; const std::vector& m_levels; }; } // texture } // vkt #endif // _VKTSAMPLEVERIFIER_HPP