blob: db724a554fec24fdb9dce717c8da4e3ef3300547 [file] [log] [blame]
// copyright (c) 2022 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.
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "VkFormatUtils.h"
namespace gfxstream {
namespace vk {
namespace {
using ::testing::AllOf;
using ::testing::ElementsAre;
using ::testing::Eq;
using ::testing::ExplainMatchResult;
using ::testing::Field;
using ::testing::IsFalse;
using ::testing::IsTrue;
MATCHER_P(EqsVkExtent3D, expected, "") {
return ExplainMatchResult(AllOf(Field("width", &VkExtent3D::width, Eq(expected.width)),
Field("height", &VkExtent3D::height, Eq(expected.height)),
Field("depth", &VkExtent3D::depth, Eq(expected.depth))),
arg, result_listener);
}
MATCHER_P(EqsVkImageSubresourceLayers, expected, "") {
return ExplainMatchResult(
AllOf(Field("aspectMask", &VkImageSubresourceLayers::aspectMask, Eq(expected.aspectMask)),
Field("mipLevel", &VkImageSubresourceLayers::mipLevel, Eq(expected.mipLevel)),
Field("baseArrayLayer", &VkImageSubresourceLayers::baseArrayLayer,
Eq(expected.baseArrayLayer)),
Field("layerCount", &VkImageSubresourceLayers::layerCount, Eq(expected.layerCount))),
arg, result_listener);
}
MATCHER_P(EqsVkOffset3D, expected, "") {
return ExplainMatchResult(AllOf(Field("x", &VkOffset3D::x, Eq(expected.x)),
Field("y", &VkOffset3D::y, Eq(expected.y)),
Field("z", &VkOffset3D::z, Eq(expected.z))),
arg, result_listener);
}
MATCHER_P(EqsVkBufferImageCopy, expected, "") {
return ExplainMatchResult(
AllOf(Field("bufferOffset", &VkBufferImageCopy::bufferOffset, Eq(expected.bufferOffset)),
Field("bufferRowLength", &VkBufferImageCopy::bufferRowLength,
Eq(expected.bufferRowLength)),
Field("bufferImageHeight", &VkBufferImageCopy::bufferImageHeight,
Eq(expected.bufferImageHeight)),
Field("imageSubresource", &VkBufferImageCopy::imageSubresource,
EqsVkImageSubresourceLayers(expected.imageSubresource)),
Field("imageOffset", &VkBufferImageCopy::imageOffset,
EqsVkOffset3D(expected.imageOffset)),
Field("imageExtent", &VkBufferImageCopy::imageExtent,
EqsVkExtent3D(expected.imageExtent))),
arg, result_listener);
}
TEST(VkFormatUtilsTest, GetTransferInfoInvalidFormat) {
const VkFormat format = VK_FORMAT_UNDEFINED;
const uint32_t width = 16;
const uint32_t height = 16;
ASSERT_THAT(getFormatTransferInfo(format, width, height, nullptr, nullptr), IsFalse());
}
TEST(VkFormatUtilsTest, GetTransferInfoRGBA) {
const VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
const uint32_t width = 16;
const uint32_t height = 16;
VkDeviceSize bufferCopySize;
std::vector<VkBufferImageCopy> bufferImageCopies;
ASSERT_THAT(getFormatTransferInfo(format, width, height, &bufferCopySize, &bufferImageCopies),
IsTrue());
EXPECT_THAT(bufferCopySize, Eq(1024));
ASSERT_THAT(bufferImageCopies, ElementsAre(EqsVkBufferImageCopy(VkBufferImageCopy{
.bufferOffset = 0,
.bufferRowLength = 16,
.bufferImageHeight = 0,
.imageSubresource =
{
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
.mipLevel = 0,
.baseArrayLayer = 0,
.layerCount = 1,
},
.imageOffset =
{
.x = 0,
.y = 0,
.z = 0,
},
.imageExtent =
{
.width = 16,
.height = 16,
.depth = 1,
},
})));
}
TEST(VkFormatUtilsTest, GetTransferInfoNV12OrNV21) {
const VkFormat format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
const uint32_t width = 16;
const uint32_t height = 16;
VkDeviceSize bufferCopySize;
std::vector<VkBufferImageCopy> bufferImageCopies;
ASSERT_THAT(getFormatTransferInfo(format, width, height, &bufferCopySize, &bufferImageCopies),
IsTrue());
EXPECT_THAT(bufferCopySize, Eq(384));
ASSERT_THAT(bufferImageCopies,
ElementsAre(EqsVkBufferImageCopy(VkBufferImageCopy{
.bufferOffset = 0,
.bufferRowLength = 16,
.bufferImageHeight = 0,
.imageSubresource =
{
.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT,
.mipLevel = 0,
.baseArrayLayer = 0,
.layerCount = 1,
},
.imageOffset =
{
.x = 0,
.y = 0,
.z = 0,
},
.imageExtent =
{
.width = 16,
.height = 16,
.depth = 1,
},
}),
EqsVkBufferImageCopy(VkBufferImageCopy{
.bufferOffset = 256,
.bufferRowLength = 8,
.bufferImageHeight = 0,
.imageSubresource =
{
.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT,
.mipLevel = 0,
.baseArrayLayer = 0,
.layerCount = 1,
},
.imageOffset =
{
.x = 0,
.y = 0,
.z = 0,
},
.imageExtent =
{
.width = 8,
.height = 8,
.depth = 1,
},
})));
}
TEST(VkFormatUtilsTest, GetTransferInfoYV12OrYV21) {
const VkFormat format = VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM;
const uint32_t width = 32;
const uint32_t height = 32;
VkDeviceSize bufferCopySize;
std::vector<VkBufferImageCopy> bufferImageCopies;
ASSERT_THAT(getFormatTransferInfo(format, width, height, &bufferCopySize, &bufferImageCopies),
IsTrue());
EXPECT_THAT(bufferCopySize, Eq(1536));
ASSERT_THAT(bufferImageCopies,
ElementsAre(EqsVkBufferImageCopy(VkBufferImageCopy{
.bufferOffset = 0,
.bufferRowLength = 32,
.bufferImageHeight = 0,
.imageSubresource =
{
.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT,
.mipLevel = 0,
.baseArrayLayer = 0,
.layerCount = 1,
},
.imageOffset =
{
.x = 0,
.y = 0,
.z = 0,
},
.imageExtent =
{
.width = 32,
.height = 32,
.depth = 1,
},
}),
EqsVkBufferImageCopy(VkBufferImageCopy{
.bufferOffset = 1024,
.bufferRowLength = 16,
.bufferImageHeight = 0,
.imageSubresource =
{
.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT,
.mipLevel = 0,
.baseArrayLayer = 0,
.layerCount = 1,
},
.imageOffset =
{
.x = 0,
.y = 0,
.z = 0,
},
.imageExtent =
{
.width = 16,
.height = 16,
.depth = 1,
},
}),
EqsVkBufferImageCopy(VkBufferImageCopy{
.bufferOffset = 1280,
.bufferRowLength = 16,
.bufferImageHeight = 0,
.imageSubresource =
{
.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT,
.mipLevel = 0,
.baseArrayLayer = 0,
.layerCount = 1,
},
.imageOffset =
{
.x = 0,
.y = 0,
.z = 0,
},
.imageExtent =
{
.width = 16,
.height = 16,
.depth = 1,
},
})));
}
} // namespace
} // namespace vk
} // namespace gfxstream