ShaderRenderCase: multiple texture handling improvements
authorPeter Gal <pgal.u-szeged@partner.samsung.com>
Wed, 28 Oct 2015 15:30:24 +0000 (16:30 +0100)
committerPeter Gal <pgal.u-szeged@partner.samsung.com>
Thu, 12 Nov 2015 18:54:16 +0000 (19:54 +0100)
* Use loadImage instead of loadPNG
* Use MovePtr when loading, passing images
* Improve TextureBinding instance passing

external/vulkancts/modules/vulkan/shaderrendercase/vktShaderDiscardTests.cpp
external/vulkancts/modules/vulkan/shaderrendercase/vktShaderRenderCase.cpp
external/vulkancts/modules/vulkan/shaderrendercase/vktShaderRenderCase.hpp

index 0526286..575ba26 100644 (file)
@@ -87,14 +87,15 @@ ShaderDiscardCaseInstance::ShaderDiscardCaseInstance (Context&                                      context,
 {
        if (usesTexture)
        {
-               m_textures.push_back(TextureBinding(m_context.getTestContext().getArchive(),
-                                                                                       "vulkan/data/brick.png",
-                                                                                       TextureBinding::TYPE_2D,
-                                                                                       tcu::Sampler(tcu::Sampler::CLAMP_TO_EDGE,
-                                                                                                               tcu::Sampler::CLAMP_TO_EDGE,
-                                                                                                               tcu::Sampler::CLAMP_TO_EDGE,
-                                                                                                               tcu::Sampler::LINEAR,
-                                                                                                               tcu::Sampler::LINEAR)));
+               de::SharedPtr<TextureBinding> brickTexture(new TextureBinding(m_context.getTestContext().getArchive(),
+                                                                                                                                         "vulkan/data/brick.png",
+                                                                                                                                         TextureBinding::TYPE_2D,
+                                                                                                                                         tcu::Sampler(tcu::Sampler::CLAMP_TO_EDGE,
+                                                                                                                                                                       tcu::Sampler::CLAMP_TO_EDGE,
+                                                                                                                                                                       tcu::Sampler::CLAMP_TO_EDGE,
+                                                                                                                                                                       tcu::Sampler::LINEAR,
+                                                                                                                                                                       tcu::Sampler::LINEAR)));
+               m_textures.push_back(brickTexture);
        }
 }
 
index 50914cd..27cc748 100644 (file)
@@ -120,59 +120,59 @@ static VkImageMemoryBarrier createImageMemoryBarrier (const VkImage&              image,
 class QuadGrid
 {
 public:
-                                                                               QuadGrid                                (int                                                            gridSize,
-                                                                                                                                int                                                            screenWidth,
-                                                                                                                                int                                                            screenHeight,
-                                                                                                                                const tcu::Vec4&                                       constCoords,
-                                                                                                                                const std::vector<tcu::Mat4>&          userAttribTransforms,
-                                                                                                                                const std::vector<TextureBinding>&     textures);
-                                                                               ~QuadGrid                               (void);
-
-       int                                                                     getGridSize                             (void) const { return m_gridSize; }
-       int                                                                     getNumVertices                  (void) const { return m_numVertices; }
-       int                                                                     getNumTriangles                 (void) const { return m_numTriangles; }
-       const tcu::Vec4&                                        getConstCoords                  (void) const { return m_constCoords; }
-       const std::vector<tcu::Mat4>            getUserAttribTransforms (void) const { return m_userAttribTransforms; }
-       const std::vector<TextureBinding>&      getTextures                             (void) const { return m_textures; }
-
-       const tcu::Vec4*                                        getPositions                    (void) const { return &m_positions[0]; }
-       const float*                                            getAttribOne                    (void) const { return &m_attribOne[0]; }
-       const tcu::Vec4*                                        getCoords                               (void) const { return &m_coords[0]; }
-       const tcu::Vec4*                                        getUnitCoords                   (void) const { return &m_unitCoords[0]; }
-
-       const tcu::Vec4*                                        getUserAttrib                   (int attribNdx) const { return &m_userAttribs[attribNdx][0]; }
-       const deUint16*                                         getIndices                              (void) const { return &m_indices[0]; }
-
-       tcu::Vec4                                                       getCoords                               (float sx, float sy) const;
-       tcu::Vec4                                                       getUnitCoords                   (float sx, float sy) const;
-
-       int                                                                     getNumUserAttribs               (void) const { return (int)m_userAttribTransforms.size(); }
-       tcu::Vec4                                                       getUserAttrib                   (int attribNdx, float sx, float sy) const;
+                                                                                       QuadGrid                                (int                                                                    gridSize,
+                                                                                                                                        int                                                                    screenWidth,
+                                                                                                                                        int                                                                    screenHeight,
+                                                                                                                                        const tcu::Vec4&                                               constCoords,
+                                                                                                                                        const std::vector<tcu::Mat4>&                  userAttribTransforms,
+                                                                                                                                        const std::vector<TextureBindingSp>&   textures);
+                                                                                       ~QuadGrid                               (void);
+
+       int                                                                             getGridSize                             (void) const { return m_gridSize; }
+       int                                                                             getNumVertices                  (void) const { return m_numVertices; }
+       int                                                                             getNumTriangles                 (void) const { return m_numTriangles; }
+       const tcu::Vec4&                                                getConstCoords                  (void) const { return m_constCoords; }
+       const std::vector<tcu::Mat4>                    getUserAttribTransforms (void) const { return m_userAttribTransforms; }
+       const std::vector<TextureBindingSp>&    getTextures                             (void) const { return m_textures; }
+
+       const tcu::Vec4*                                                getPositions                    (void) const { return &m_positions[0]; }
+       const float*                                                    getAttribOne                    (void) const { return &m_attribOne[0]; }
+       const tcu::Vec4*                                                getCoords                               (void) const { return &m_coords[0]; }
+       const tcu::Vec4*                                                getUnitCoords                   (void) const { return &m_unitCoords[0]; }
+
+       const tcu::Vec4*                                                getUserAttrib                   (int attribNdx) const { return &m_userAttribs[attribNdx][0]; }
+       const deUint16*                                                 getIndices                              (void) const { return &m_indices[0]; }
+
+       tcu::Vec4                                                               getCoords                               (float sx, float sy) const;
+       tcu::Vec4                                                               getUnitCoords                   (float sx, float sy) const;
+
+       int                                                                             getNumUserAttribs               (void) const { return (int)m_userAttribTransforms.size(); }
+       tcu::Vec4                                                               getUserAttrib                   (int attribNdx, float sx, float sy) const;
 
 private:
-       const int                                                       m_gridSize;
-       const int                                                       m_numVertices;
-       const int                                                       m_numTriangles;
-       const tcu::Vec4                                         m_constCoords;
-       const std::vector<tcu::Mat4>            m_userAttribTransforms;
-
-       const std::vector<TextureBinding>       m_textures;
-
-       std::vector<tcu::Vec4>                          m_screenPos;
-       std::vector<tcu::Vec4>                          m_positions;
-       std::vector<tcu::Vec4>                          m_coords;               //!< Near-unit coordinates, roughly [-2.0 .. 2.0].
-       std::vector<tcu::Vec4>                          m_unitCoords;   //!< Positive-only coordinates [0.0 .. 1.5].
-       std::vector<float>                                      m_attribOne;
-       std::vector<tcu::Vec4>                          m_userAttribs[ShaderEvalContext::MAX_TEXTURES];
-       std::vector<deUint16>                           m_indices;
+       const int                                                               m_gridSize;
+       const int                                                               m_numVertices;
+       const int                                                               m_numTriangles;
+       const tcu::Vec4                                                 m_constCoords;
+       const std::vector<tcu::Mat4>                    m_userAttribTransforms;
+
+       const std::vector<TextureBindingSp>&    m_textures;
+
+       std::vector<tcu::Vec4>                                  m_screenPos;
+       std::vector<tcu::Vec4>                                  m_positions;
+       std::vector<tcu::Vec4>                                  m_coords;               //!< Near-unit coordinates, roughly [-2.0 .. 2.0].
+       std::vector<tcu::Vec4>                                  m_unitCoords;   //!< Positive-only coordinates [0.0 .. 1.5].
+       std::vector<float>                                              m_attribOne;
+       std::vector<tcu::Vec4>                                  m_userAttribs[ShaderEvalContext::MAX_TEXTURES];
+       std::vector<deUint16>                                   m_indices;
 };
 
-QuadGrid::QuadGrid (int                                                                        gridSize,
-                                       int                                                                     width,
-                                       int                                                                     height,
-                                       const tcu::Vec4&                                        constCoords,
-                                       const std::vector<tcu::Mat4>&           userAttribTransforms,
-                                       const std::vector<TextureBinding>&      textures)
+QuadGrid::QuadGrid (int                                                                                gridSize,
+                                       int                                                                             width,
+                                       int                                                                             height,
+                                       const tcu::Vec4&                                                constCoords,
+                                       const std::vector<tcu::Mat4>&                   userAttribTransforms,
+                                       const std::vector<TextureBindingSp>&    textures)
        : m_gridSize                            (gridSize)
        , m_numVertices                         ((gridSize + 1) * (gridSize + 1))
        , m_numTriangles                        (gridSize * gridSize * 2)
@@ -268,45 +268,38 @@ TextureBinding::TextureBinding (const tcu::Archive&       archive,
 {
        switch(m_type)
        {
-               case TYPE_2D: m_binding.tex2D = loadTexture2D(archive, filename); break;
+               case TYPE_2D: m_binding.tex2D = loadTexture2D(archive, filename).release(); break;
                default:
                        TCU_FAIL("Unsupported texture type");
        }
 }
 
-tcu::Texture2D* TextureBinding::loadTexture2D (const tcu::Archive& archive, const char* filename)
+TextureBinding::~TextureBinding (void)
 {
-       std::string ext = de::FilePath(filename).getFileExtension();
-
-       if (ext == "png")
+       switch(m_type)
        {
-               // Uncompressed texture.
-               tcu::TextureLevel level;
-               tcu::ImageIO::loadPNG(level, archive, filename);
+               case TYPE_2D: delete m_binding.tex2D; break;
+               default: break;
+       }
+}
 
-               TCU_CHECK_INTERNAL(level.getFormat() == tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8) ||
-                                                       level.getFormat() == tcu::TextureFormat(tcu::TextureFormat::RGB, tcu::TextureFormat::UNORM_INT8));
 
-               // \todo [2015-10-08 elecro] for some reason we get better when using RGBA texture even in RGB case, this needs to be investigated
-               tcu::Texture2D* texture = new tcu::Texture2D(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), level.getWidth(), level.getHeight());
+de::MovePtr<tcu::Texture2D> TextureBinding::loadTexture2D (const tcu::Archive& archive, const char* filename)
+{
+       tcu::TextureLevel level;
+       tcu::ImageIO::loadImage(level, archive, filename);
 
-               try
-               {
-                       // Fill level 0.
-                       texture->allocLevel(0);
+       TCU_CHECK_INTERNAL(level.getFormat() == tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8) ||
+                                          level.getFormat() == tcu::TextureFormat(tcu::TextureFormat::RGB, tcu::TextureFormat::UNORM_INT8));
 
-                       tcu::copy(texture->getLevel(0), level.getAccess());
-               }
-               catch (const std::exception&)
-               {
-                       delete texture;
-                       throw;
-               }
+       // \todo [2015-10-08 elecro] for some reason we get better when using RGBA texture even in RGB case, this needs to be investigated
+       de::MovePtr<tcu::Texture2D> texture(new tcu::Texture2D(tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8), level.getWidth(), level.getHeight()));
 
-               return texture;
-       }
-       else
-               TCU_FAIL("Unsupported file format"); // TODO: maybe support pkm?
+       // Fill level 0.
+       texture->allocLevel(0);
+       tcu::copy(texture->getLevel(0), level.getAccess());
+
+       return texture;
 }
 
 // ShaderEvalContext.
@@ -316,13 +309,13 @@ ShaderEvalContext::ShaderEvalContext (const QuadGrid& quadGrid)
        , isDiscarded   (false)
        , m_quadGrid    (quadGrid)
 {
-       const std::vector<TextureBinding>& bindings = m_quadGrid.getTextures();
+       const std::vector<TextureBindingSp>& bindings = m_quadGrid.getTextures();
        DE_ASSERT((int)bindings.size() <= MAX_TEXTURES);
 
        // Fill in texture array.
        for (int ndx = 0; ndx < (int)bindings.size(); ndx++)
        {
-               const TextureBinding& binding = bindings[ndx];
+               const TextureBinding& binding = *bindings[ndx];
 
                if (binding.getType() == TextureBinding::TYPE_NONE)
                        continue;
@@ -331,7 +324,7 @@ ShaderEvalContext::ShaderEvalContext (const QuadGrid& quadGrid)
 
                switch (binding.getType())
                {
-                       case TextureBinding::TYPE_2D:           textures[ndx].tex2D                     = binding.get2D();              break;
+                       case TextureBinding::TYPE_2D:           textures[ndx].tex2D                     = &binding.get2D();             break;
                        // \todo [2015-09-07 elecro] Add support for the other binding types
                        /*
                        case TextureBinding::TYPE_CUBE_MAP:     textures[ndx].texCube           = binding.getCube();    break;
@@ -971,35 +964,33 @@ void ShaderRenderCaseInstance::useSampler2D (deUint32 bindingLocation, deUint32
 
        const VkDevice                                  vkDevice                = m_context.getDevice();
        const DeviceInterface&                  vk                              = m_context.getDeviceInterface();
-       const TextureBinding&                   textureBinding  = m_textures[textureID];
-       const tcu::Texture2D*                   refTexture              = textureBinding.get2D();
+       const TextureBinding&                   textureBinding  = *m_textures[textureID];
+       const tcu::Texture2D&                   refTexture              = textureBinding.get2D();
        const tcu::Sampler&                             refSampler              = textureBinding.getSampler();
-       const VkFormat                                  format                  = refTexture->getFormat() == tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8)
+       const VkFormat                                  format                  = refTexture.getFormat() == tcu::TextureFormat(tcu::TextureFormat::RGBA, tcu::TextureFormat::UNORM_INT8)
                                                                                                                ? VK_FORMAT_R8G8B8A8_UNORM
                                                                                                                : VK_FORMAT_R8G8B8_UNORM;
 
-       DE_ASSERT(refTexture != DE_NULL);
-
        // Create & alloc the image
        Move<VkImage>                                   vkTexture;
        de::MovePtr<Allocation>         allocation;
 
        if (isSupportedLinearTilingFormat(m_context.getInstanceInterface(), m_context.getPhysicalDevice(), format))
        {
-               vkTexture = createImage2D(*refTexture, format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR);
-               allocation = uploadImage2D(*refTexture, *vkTexture);
+               vkTexture = createImage2D(refTexture, format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR);
+               allocation = uploadImage2D(refTexture, *vkTexture);
        }
        else if (isSupportedOptimalTilingFormat(m_context.getInstanceInterface(), m_context.getPhysicalDevice(), format))
        {
-               Move<VkImage>                           stagingTexture  (createImage2D(*refTexture, format, VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT, VK_IMAGE_TILING_LINEAR));
-               de::MovePtr<Allocation>         stagingAlloc    (uploadImage2D(*refTexture, *stagingTexture));
+               Move<VkImage>                           stagingTexture  (createImage2D(refTexture, format, VK_IMAGE_USAGE_TRANSFER_SOURCE_BIT, VK_IMAGE_TILING_LINEAR));
+               de::MovePtr<Allocation>         stagingAlloc    (uploadImage2D(refTexture, *stagingTexture));
 
                const VkImageUsageFlags         dstUsageFlags   = VK_IMAGE_USAGE_TRANSFER_DESTINATION_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
-               vkTexture = createImage2D(*refTexture, format, dstUsageFlags, VK_IMAGE_TILING_OPTIMAL);
+               vkTexture = createImage2D(refTexture, format, dstUsageFlags, VK_IMAGE_TILING_OPTIMAL);
                allocation = m_memAlloc.allocate(getImageMemoryRequirements(vk, vkDevice, *vkTexture), MemoryRequirement::Any);
                VK_CHECK(vk.bindImageMemory(vkDevice, *vkTexture, allocation->getMemory(), allocation->getOffset()));
 
-               copyTilingImageToOptimal(*stagingTexture, *vkTexture, refTexture->getWidth(), refTexture->getHeight());
+               copyTilingImageToOptimal(*stagingTexture, *vkTexture, refTexture.getWidth(), refTexture.getHeight());
        }
        else
        {
index 34e21ff..e7f9721 100644 (file)
@@ -72,26 +72,32 @@ public:
                TYPE_LAST
        };
 
-                                                       TextureBinding          (const tcu::Archive&    archive,
-                                                                                                const char*                    filename,
-                                                                                                const Type                             type,
-                                                                                                const tcu::Sampler&    sampler);
-
-       Type                                    getType                         (void) const { return m_type;           }
-       const tcu::Sampler&             getSampler                      (void) const { return m_sampler;        }
-       const tcu::Texture2D*   get2D                           (void) const { DE_ASSERT(getType() == TYPE_2D); return m_binding.tex2D; }
+                                                                               TextureBinding          (const tcu::Archive&    archive,
+                                                                                                                       const char*                             filename,
+                                                                                                                       const Type                              type,
+                                                                                                                       const tcu::Sampler&             sampler);
+                                                                               ~TextureBinding         (void);
+       Type                                                            getType                         (void) const { return m_type;           }
+       const tcu::Sampler&                                     getSampler                      (void) const { return m_sampler;        }
+       const tcu::Texture2D&                           get2D                           (void) const { DE_ASSERT(getType() == TYPE_2D && m_binding.tex2D !=NULL); return *m_binding.tex2D; }
 
 private:
-       static tcu::Texture2D*  loadTexture2D           (const tcu::Archive& archive, const char* filename);
+                                                                               TextureBinding          (const TextureBinding&);        // not allowed!
+       TextureBinding&                                         operator=                       (const TextureBinding&);        // not allowed!
+
+       static de::MovePtr<tcu::Texture2D>      loadTexture2D           (const tcu::Archive& archive, const char* filename);
+
+       Type                                                            m_type;
+       tcu::Sampler                                            m_sampler;
 
-       Type                                    m_type;
-       tcu::Sampler                    m_sampler;
        union
        {
                const tcu::Texture2D*   tex2D;
        } m_binding;
 };
 
+typedef de::SharedPtr<TextureBinding> TextureBindingSp;
+
 // ShaderEvalContext.
 
 class ShaderEvalContext
@@ -392,7 +398,7 @@ protected:
 
        std::vector<tcu::Mat4>                                                          m_userAttribTransforms;
        const tcu::Vec4                                                                         m_clearColor;
-       std::vector<TextureBinding>                                                     m_textures;
+       std::vector<TextureBindingSp>                                           m_textures;
 
        vk::SimpleAllocator                                                                     m_memAlloc;