Refactor writing texture level descriptor info
This will make it easier to write YCbCr plane data as mipmap levels.
Also removes the unused fWidth, fHeight, and fDepth from sw::Mipmap,
and ensured the other members are aligned to their vector size.
Bug: b/132437008
Tests: dEQP-VK.*ycbcr*
Change-Id: Ib2b0cbebf9e4fd640fcc104281097ff3c4c73b5d
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/31616
Presubmit-Ready: Nicolas Capens <nicolascapens@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
diff --git a/src/Device/Sampler.hpp b/src/Device/Sampler.hpp
index 65313ba..48ca936 100644
--- a/src/Device/Sampler.hpp
+++ b/src/Device/Sampler.hpp
@@ -31,13 +31,13 @@
{
const void *buffer[6];
- short uHalf[4];
- short vHalf[4];
- short wHalf[4];
+ short4 uHalf;
+ short4 vHalf;
+ short4 wHalf;
int4 width;
int4 height;
int4 depth;
- short onePitchP[4];
+ short4 onePitchP;
int4 pitchP;
int4 sliceP;
};
diff --git a/src/Vulkan/VkDescriptorSetLayout.cpp b/src/Vulkan/VkDescriptorSetLayout.cpp
index d0b906a..afd621c 100644
--- a/src/Vulkan/VkDescriptorSetLayout.cpp
+++ b/src/Vulkan/VkDescriptorSetLayout.cpp
@@ -333,14 +333,17 @@
}
}
else if (entry.descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER ||
- entry.descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE)
+ entry.descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE)
{
SampledImageDescriptor *imageSampler = reinterpret_cast<SampledImageDescriptor*>(memToWrite);
for(uint32_t i = 0; i < entry.descriptorCount; i++)
{
auto update = reinterpret_cast<VkDescriptorImageInfo const *>(src + entry.offset + entry.stride * i);
+
vk::ImageView *imageView = vk::Cast(update->imageView);
+ Format format = imageView->getFormat(ImageView::SAMPLING);
+
sw::Texture *texture = &imageSampler[i].texture;
// "All consecutive bindings updated via a single VkWriteDescriptorSet structure, except those with a
@@ -357,7 +360,7 @@
imageSampler[i].sampleCount = imageView->getSampleCount();
imageSampler[i].type = imageView->getType();
imageSampler[i].swizzle = imageView->getComponentMapping();
- imageSampler[i].format = imageView->getFormat(ImageView::SAMPLING);
+ imageSampler[i].format = format;
auto &subresourceRange = imageView->getSubresourceRange();
@@ -387,113 +390,15 @@
}
VkExtent3D extent = imageView->getMipLevelExtent(level);
- Format format = imageView->getFormat(ImageView::SAMPLING);
- int layers = imageView->getSubresourceRange().layerCount;
- // TODO(b/129523279): Untangle depth vs layers throughout the sampler
+
int width = extent.width;
int height = extent.height;
+ int layers = imageView->getSubresourceRange().layerCount; // TODO(b/129523279): Untangle depth vs layers throughout the sampler
int depth = layers > 1 ? layers : extent.depth;
int pitchP = imageView->rowPitchBytes(aspect, level, ImageView::SAMPLING) / format.bytes();
int sliceP = (layers > 1 ? imageView->layerPitchBytes(aspect, ImageView::SAMPLING) : imageView->slicePitchBytes(aspect, level, ImageView::SAMPLING)) / format.bytes();
- if(mipmapLevel == 0)
- {
- texture->widthWidthHeightHeight[0] = width;
- texture->widthWidthHeightHeight[1] = width;
- texture->widthWidthHeightHeight[2] = height;
- texture->widthWidthHeightHeight[3] = height;
-
- texture->width[0] = width;
- texture->width[1] = width;
- texture->width[2] = width;
- texture->width[3] = width;
-
- texture->height[0] = height;
- texture->height[1] = height;
- texture->height[2] = height;
- texture->height[3] = height;
-
- texture->depth[0] = depth;
- texture->depth[1] = depth;
- texture->depth[2] = depth;
- texture->depth[3] = depth;
- }
-
- short halfTexelU = 0x8000 / width;
- short halfTexelV = 0x8000 / height;
- short halfTexelW = 0x8000 / depth;
-
- mipmap.uHalf[0] = halfTexelU;
- mipmap.uHalf[1] = halfTexelU;
- mipmap.uHalf[2] = halfTexelU;
- mipmap.uHalf[3] = halfTexelU;
-
- mipmap.vHalf[0] = halfTexelV;
- mipmap.vHalf[1] = halfTexelV;
- mipmap.vHalf[2] = halfTexelV;
- mipmap.vHalf[3] = halfTexelV;
-
- mipmap.wHalf[0] = halfTexelW;
- mipmap.wHalf[1] = halfTexelW;
- mipmap.wHalf[2] = halfTexelW;
- mipmap.wHalf[3] = halfTexelW;
-
- mipmap.width[0] = width;
- mipmap.width[1] = width;
- mipmap.width[2] = width;
- mipmap.width[3] = width;
-
- mipmap.height[0] = height;
- mipmap.height[1] = height;
- mipmap.height[2] = height;
- mipmap.height[3] = height;
-
- mipmap.depth[0] = depth;
- mipmap.depth[1] = depth;
- mipmap.depth[2] = depth;
- mipmap.depth[3] = depth;
-
- mipmap.onePitchP[0] = 1;
- mipmap.onePitchP[1] = pitchP;
- mipmap.onePitchP[2] = 1;
- mipmap.onePitchP[3] = pitchP;
-
- mipmap.pitchP[0] = pitchP;
- mipmap.pitchP[1] = pitchP;
- mipmap.pitchP[2] = pitchP;
- mipmap.pitchP[3] = pitchP;
-
- mipmap.sliceP[0] = sliceP;
- mipmap.sliceP[1] = sliceP;
- mipmap.sliceP[2] = sliceP;
- mipmap.sliceP[3] = sliceP;
-
- // TODO(b/129523279)
- if(false/*format == FORMAT_YV12_BT601 ||
- format == FORMAT_YV12_BT709 ||
- format == FORMAT_YV12_JFIF*/)
- {
- unsigned int YStride = pitchP;
- unsigned int YSize = YStride * height;
- unsigned int CStride = sw::align<16>(YStride / 2);
- unsigned int CSize = CStride * height / 2;
-
- mipmap.buffer[1] = (sw::byte*)mipmap.buffer[0] + YSize;
- mipmap.buffer[2] = (sw::byte*)mipmap.buffer[1] + CSize;
-
- texture->mipmap[1].width[0] = width / 2;
- texture->mipmap[1].width[1] = width / 2;
- texture->mipmap[1].width[2] = width / 2;
- texture->mipmap[1].width[3] = width / 2;
- texture->mipmap[1].height[0] = height / 2;
- texture->mipmap[1].height[1] = height / 2;
- texture->mipmap[1].height[2] = height / 2;
- texture->mipmap[1].height[3] = height / 2;
- texture->mipmap[1].onePitchP[0] = 1;
- texture->mipmap[1].onePitchP[1] = CStride;
- texture->mipmap[1].onePitchP[2] = 1;
- texture->mipmap[1].onePitchP[3] = CStride;
- }
+ WriteTextureLevelInfo(texture, mipmapLevel, width, height, depth, pitchP, sliceP);
}
}
}
@@ -561,6 +466,83 @@
}
}
+void DescriptorSetLayout::WriteTextureLevelInfo(sw::Texture *texture, int level, int width, int height, int depth, int pitchP, int sliceP)
+{
+ if(level == 0)
+ {
+ texture->widthWidthHeightHeight[0] = width;
+ texture->widthWidthHeightHeight[1] = width;
+ texture->widthWidthHeightHeight[2] = height;
+ texture->widthWidthHeightHeight[3] = height;
+
+ texture->width[0] = width;
+ texture->width[1] = width;
+ texture->width[2] = width;
+ texture->width[3] = width;
+
+ texture->height[0] = height;
+ texture->height[1] = height;
+ texture->height[2] = height;
+ texture->height[3] = height;
+
+ texture->depth[0] = depth;
+ texture->depth[1] = depth;
+ texture->depth[2] = depth;
+ texture->depth[3] = depth;
+ }
+
+ sw::Mipmap &mipmap = texture->mipmap[level];
+
+ short halfTexelU = 0x8000 / width;
+ short halfTexelV = 0x8000 / height;
+ short halfTexelW = 0x8000 / depth;
+
+ mipmap.uHalf[0] = halfTexelU;
+ mipmap.uHalf[1] = halfTexelU;
+ mipmap.uHalf[2] = halfTexelU;
+ mipmap.uHalf[3] = halfTexelU;
+
+ mipmap.vHalf[0] = halfTexelV;
+ mipmap.vHalf[1] = halfTexelV;
+ mipmap.vHalf[2] = halfTexelV;
+ mipmap.vHalf[3] = halfTexelV;
+
+ mipmap.wHalf[0] = halfTexelW;
+ mipmap.wHalf[1] = halfTexelW;
+ mipmap.wHalf[2] = halfTexelW;
+ mipmap.wHalf[3] = halfTexelW;
+
+ mipmap.width[0] = width;
+ mipmap.width[1] = width;
+ mipmap.width[2] = width;
+ mipmap.width[3] = width;
+
+ mipmap.height[0] = height;
+ mipmap.height[1] = height;
+ mipmap.height[2] = height;
+ mipmap.height[3] = height;
+
+ mipmap.depth[0] = depth;
+ mipmap.depth[1] = depth;
+ mipmap.depth[2] = depth;
+ mipmap.depth[3] = depth;
+
+ mipmap.onePitchP[0] = 1;
+ mipmap.onePitchP[1] = pitchP;
+ mipmap.onePitchP[2] = 1;
+ mipmap.onePitchP[3] = pitchP;
+
+ mipmap.pitchP[0] = pitchP;
+ mipmap.pitchP[1] = pitchP;
+ mipmap.pitchP[2] = pitchP;
+ mipmap.pitchP[3] = pitchP;
+
+ mipmap.sliceP[0] = sliceP;
+ mipmap.sliceP[1] = sliceP;
+ mipmap.sliceP[2] = sliceP;
+ mipmap.sliceP[3] = sliceP;
+}
+
void DescriptorSetLayout::WriteDescriptorSet(const VkWriteDescriptorSet& writeDescriptorSet)
{
DescriptorSet* dstSet = vk::Cast(writeDescriptorSet.dstSet);
diff --git a/src/Vulkan/VkDescriptorSetLayout.hpp b/src/Vulkan/VkDescriptorSetLayout.hpp
index a67b261..08408f2 100644
--- a/src/Vulkan/VkDescriptorSetLayout.hpp
+++ b/src/Vulkan/VkDescriptorSetLayout.hpp
@@ -82,6 +82,7 @@
static void CopyDescriptorSet(const VkCopyDescriptorSet& descriptorCopies);
static void WriteDescriptorSet(DescriptorSet *dstSet, VkDescriptorUpdateTemplateEntry const &entry, char const *src);
+ static void WriteTextureLevelInfo(sw::Texture *texture, int level, int width, int height, int depth, int pitchP, int sliceP);
void initialize(VkDescriptorSet descriptorSet);