Commit 172e5d37 by Shahbaz Youssefi Committed by Commit Bot

Vulkan: Implement universal stencil resolve

This is done by resolving stencil into a temporary buffer and copying that into the stencil aspect of the resolved image. Bug: angleproject:3200 Change-Id: I29111b44db2cb093acc4544034fbe61178f055a1 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1635709 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarTim Van Patten <timvp@google.com>
parent ab6a59b2
...@@ -359,6 +359,10 @@ ...@@ -359,6 +359,10 @@
"69e0611ce405ee7525af2a59fe3dce02", "69e0611ce405ee7525af2a59fe3dce02",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ResolveDepthStencil.frag.00000005.inc": "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ResolveDepthStencil.frag.00000005.inc":
"ba039e31d7c2259337f80ed6038aafd5", "ba039e31d7c2259337f80ed6038aafd5",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ResolveStencilNoExport.comp.00000000.inc":
"46e731194edd3eca95a8aeade5fea543",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ResolveStencilNoExport.comp.00000001.inc":
"5f9bbc046387b04be58dbd71988abfc2",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/BufferUtils.comp": "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/BufferUtils.comp":
"0c8c050841543da0d7faca2559212aa8", "0c8c050841543da0d7faca2559212aa8",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/ConvertVertex.comp": "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/ConvertVertex.comp":
...@@ -373,10 +377,12 @@ ...@@ -373,10 +377,12 @@
"8279b03e2a8b9a495167bf7fe2567716", "8279b03e2a8b9a495167bf7fe2567716",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/ResolveDepthStencil.frag": "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/ResolveDepthStencil.frag":
"59a1e12ffdb34a4aacf92f96a4fe9c5a", "59a1e12ffdb34a4aacf92f96a4fe9c5a",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/ResolveStencilNoExport.comp":
"645d157257fd8b5315ed56cc12bc94b9",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp": "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.cpp":
"50608a69c5126b000ab57d3ea4f1ee18", "0826fbfe8c7282b0c99739f75f32f3ed",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h": "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/vk_internal_shaders_autogen.h":
"719c05d2beed281df2227626a44de35f", "c2fe4b6694f433e53177ab9377e4f487",
"Vulkan internal shader programs:tools/glslang/glslang_validator.exe.sha1": "Vulkan internal shader programs:tools/glslang/glslang_validator.exe.sha1":
"9f1f0fc61116a657e065c40f9296e5ab", "9f1f0fc61116a657e065c40f9296e5ab",
"Vulkan internal shader programs:tools/glslang/glslang_validator.sha1": "Vulkan internal shader programs:tools/glslang/glslang_validator.sha1":
......
...@@ -956,8 +956,26 @@ angle::Result FramebufferVk::resolve(ContextVk *contextVk, ...@@ -956,8 +956,26 @@ angle::Result FramebufferVk::resolve(ContextVk *contextVk,
&stencilView.get(), levelIndex, 1, layerIndex, 1)); &stencilView.get(), levelIndex, 1, layerIndex, 1));
} }
ANGLE_TRY(utilsVk.depthStencilResolve(contextVk, this, depthStencilImage, &depthView.get(), // If shader stencil export is not possible, defer stencil resolve to another pass.
&stencilView.get(), params)); bool hasShaderStencilExport =
contextVk->getRenderer()->getFeatures().supportsShaderStencilExport.enabled;
vk::ImageView noStencilView;
// Resolve depth. If shader stencil export is present, resolve stencil as well.
if (resolveDepthBuffer || (resolveStencilBuffer && hasShaderStencilExport))
{
ANGLE_TRY(utilsVk.depthStencilResolve(
contextVk, this, depthStencilImage, &depthView.get(),
hasShaderStencilExport ? &stencilView.get() : &noStencilView, params));
}
// If shader stencil export is not present, resolve stencil through a different path.
if (resolveStencilBuffer && !hasShaderStencilExport)
{
ANGLE_TRY(utilsVk.stencilResolveNoShaderExport(contextVk, this, depthStencilImage,
&stencilView.get(), params));
}
vk::ImageView depthViewObject = depthView.release(); vk::ImageView depthViewObject = depthView.release();
vk::ImageView stencilViewObject = stencilView.release(); vk::ImageView stencilViewObject = stencilView.release();
......
...@@ -11,17 +11,19 @@ ...@@ -11,17 +11,19 @@
#include "libANGLE/renderer/vulkan/ContextVk.h" #include "libANGLE/renderer/vulkan/ContextVk.h"
#include "libANGLE/renderer/vulkan/FramebufferVk.h" #include "libANGLE/renderer/vulkan/FramebufferVk.h"
#include "libANGLE/renderer/vulkan/RenderTargetVk.h"
#include "libANGLE/renderer/vulkan/RendererVk.h" #include "libANGLE/renderer/vulkan/RendererVk.h"
namespace rx namespace rx
{ {
namespace BufferUtils_comp = vk::InternalShader::BufferUtils_comp; namespace BufferUtils_comp = vk::InternalShader::BufferUtils_comp;
namespace ConvertVertex_comp = vk::InternalShader::ConvertVertex_comp; namespace ConvertVertex_comp = vk::InternalShader::ConvertVertex_comp;
namespace ImageClear_frag = vk::InternalShader::ImageClear_frag; namespace ImageClear_frag = vk::InternalShader::ImageClear_frag;
namespace ImageCopy_frag = vk::InternalShader::ImageCopy_frag; namespace ImageCopy_frag = vk::InternalShader::ImageCopy_frag;
namespace ResolveColor_frag = vk::InternalShader::ResolveColor_frag; namespace ResolveColor_frag = vk::InternalShader::ResolveColor_frag;
namespace ResolveDepthStencil_frag = vk::InternalShader::ResolveDepthStencil_frag; namespace ResolveDepthStencil_frag = vk::InternalShader::ResolveDepthStencil_frag;
namespace ResolveStencilNoExport_comp = vk::InternalShader::ResolveStencilNoExport_comp;
namespace namespace
{ {
...@@ -37,6 +39,8 @@ constexpr uint32_t kImageCopySourceBinding = 0; ...@@ -37,6 +39,8 @@ constexpr uint32_t kImageCopySourceBinding = 0;
constexpr uint32_t kResolveColorSourceBinding = 0; constexpr uint32_t kResolveColorSourceBinding = 0;
constexpr uint32_t kResolveDepthStencilDepthBinding = 0; constexpr uint32_t kResolveDepthStencilDepthBinding = 0;
constexpr uint32_t kResolveDepthStencilStencilBinding = 1; constexpr uint32_t kResolveDepthStencilStencilBinding = 1;
constexpr uint32_t kResolveStencilNoExportDestBinding = 0;
constexpr uint32_t kResolveStencilNoExportSrcBinding = 1;
uint32_t GetBufferUtilsFlags(size_t dispatchSize, const vk::Format &format) uint32_t GetBufferUtilsFlags(size_t dispatchSize, const vk::Format &format)
{ {
...@@ -270,6 +274,10 @@ void UtilsVk::destroy(VkDevice device) ...@@ -270,6 +274,10 @@ void UtilsVk::destroy(VkDevice device)
{ {
program.destroy(device); program.destroy(device);
} }
for (vk::ShaderProgramHelper &program : mResolveStencilNoExportPrograms)
{
program.destroy(device);
}
} }
angle::Result UtilsVk::ensureResourcesInitialized(ContextVk *context, angle::Result UtilsVk::ensureResourcesInitialized(ContextVk *context,
...@@ -421,6 +429,23 @@ angle::Result UtilsVk::ensureResolveDepthStencilResourcesInitialized(ContextVk * ...@@ -421,6 +429,23 @@ angle::Result UtilsVk::ensureResolveDepthStencilResourcesInitialized(ContextVk *
ArraySize(setSizes), sizeof(ResolveDepthStencilShaderParams)); ArraySize(setSizes), sizeof(ResolveDepthStencilShaderParams));
} }
angle::Result UtilsVk::ensureResolveStencilNoExportResourcesInitialized(ContextVk *context)
{
if (mPipelineLayouts[Function::ResolveStencilNoExport].valid())
{
return angle::Result::Continue;
}
VkDescriptorPoolSize setSizes[2] = {
{VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1},
{VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1},
};
return ensureResourcesInitialized(context, Function::ResolveStencilNoExport, setSizes,
ArraySize(setSizes),
sizeof(ResolveStencilNoExportShaderParams));
}
angle::Result UtilsVk::setupProgram(ContextVk *context, angle::Result UtilsVk::setupProgram(ContextVk *context,
Function function, Function function,
vk::RefCounted<vk::ShaderAndSerial> *fsCsShader, vk::RefCounted<vk::ShaderAndSerial> *fsCsShader,
...@@ -962,9 +987,6 @@ angle::Result UtilsVk::depthStencilResolve(ContextVk *contextVk, ...@@ -962,9 +987,6 @@ angle::Result UtilsVk::depthStencilResolve(ContextVk *contextVk,
if (resolveStencil) if (resolveStencil)
{ {
// TODO(syoussefi): This needs VK_EXT_shader_stencil_export which is apparently only
// supported in Mesa and AMD's windows driver.
// http://anglebug.com/3200
const uint8_t completeMask = 0xFF; const uint8_t completeMask = 0xFF;
const uint8_t unusedReference = 0x00; const uint8_t unusedReference = 0x00;
...@@ -1044,6 +1066,153 @@ angle::Result UtilsVk::depthStencilResolve(ContextVk *contextVk, ...@@ -1044,6 +1066,153 @@ angle::Result UtilsVk::depthStencilResolve(ContextVk *contextVk,
return angle::Result::Continue; return angle::Result::Continue;
} }
angle::Result UtilsVk::stencilResolveNoShaderExport(ContextVk *contextVk,
FramebufferVk *framebuffer,
vk::ImageHelper *src,
const vk::ImageView *srcStencilView,
const ResolveParameters &params)
{
// When VK_EXT_shader_stencil_export is not available, stencil is resolved into a temporary
// buffer which is then copied into the stencil aspect of the image.
ANGLE_TRY(ensureResolveStencilNoExportResourcesInitialized(contextVk));
VkDescriptorSet descriptorSet;
vk::RefCountedDescriptorPoolBinding descriptorPoolBinding;
ANGLE_TRY(mDescriptorPools[Function::ResolveStencilNoExport].allocateSets(
contextVk, mDescriptorSetLayouts[Function::ResolveStencilNoExport][kSetIndex].get().ptr(),
1, &descriptorPoolBinding, &descriptorSet));
descriptorPoolBinding.get().updateSerial(contextVk->getCurrentQueueSerial());
// Create a temporary buffer to resolve stencil into.
vk::Scoped<vk::BufferHelper> resolveBuffer(contextVk->getDevice());
uint32_t bufferRowLengthInUints =
UnsignedCeilDivide(params.resolveArea.width, sizeof(uint32_t));
VkDeviceSize bufferSize = bufferRowLengthInUints * sizeof(uint32_t) * params.resolveArea.height;
VkBufferCreateInfo resolveBufferInfo = {};
resolveBufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
resolveBufferInfo.flags = 0;
resolveBufferInfo.size = bufferSize;
resolveBufferInfo.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT | VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
resolveBufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
resolveBufferInfo.queueFamilyIndexCount = 0;
resolveBufferInfo.pQueueFamilyIndices = nullptr;
ANGLE_TRY(resolveBuffer.get().init(contextVk, resolveBufferInfo,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
resolveBuffer.get().updateQueueSerial(contextVk->getCurrentQueueSerial());
ResolveStencilNoExportShaderParams shaderParams;
shaderParams.srcExtent[0] = params.srcExtents[0];
shaderParams.srcExtent[1] = params.srcExtents[1];
shaderParams.srcOffset[0] = params.srcOffset[0];
shaderParams.srcOffset[1] = params.srcOffset[1];
shaderParams.destPitch = bufferRowLengthInUints;
shaderParams.destExtent[0] = params.resolveArea.width;
shaderParams.destExtent[1] = params.resolveArea.height;
shaderParams.srcLayer = params.srcLayer;
shaderParams.flipX = params.flipX;
shaderParams.flipY = params.flipY;
uint32_t flags = src->getLayerCount() > 1 ? ResolveStencilNoExport_comp::kSrcIsArray : 0;
// Change source layout prior to computation.
if (src->isLayoutChangeNecessary(vk::ImageLayout::ComputeShaderReadOnly))
{
vk::CommandBuffer *srcLayoutChange;
ANGLE_TRY(src->recordCommands(contextVk, &srcLayoutChange));
src->changeLayout(src->getAspectFlags(), vk::ImageLayout::ComputeShaderReadOnly,
srcLayoutChange);
}
vk::CommandBuffer *commandBuffer;
ANGLE_TRY(framebuffer->getFramebuffer()->recordCommands(contextVk, &commandBuffer));
src->addReadDependency(framebuffer->getFramebuffer());
// Resolve stencil into the buffer.
VkDescriptorImageInfo imageInfo = {};
imageInfo.imageView = srcStencilView->getHandle();
imageInfo.imageLayout = src->getCurrentLayout();
VkDescriptorBufferInfo bufferInfo = {};
bufferInfo.buffer = resolveBuffer.get().getBuffer().getHandle();
bufferInfo.offset = 0;
bufferInfo.range = VK_WHOLE_SIZE;
VkWriteDescriptorSet writeInfos[2] = {};
writeInfos[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
writeInfos[0].dstSet = descriptorSet;
writeInfos[0].dstBinding = kResolveStencilNoExportDestBinding;
writeInfos[0].descriptorCount = 1;
writeInfos[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
writeInfos[0].pBufferInfo = &bufferInfo;
writeInfos[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
writeInfos[1].dstSet = descriptorSet;
writeInfos[1].dstBinding = kResolveStencilNoExportSrcBinding;
writeInfos[1].descriptorCount = 1;
writeInfos[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
writeInfos[1].pImageInfo = &imageInfo;
vkUpdateDescriptorSets(contextVk->getDevice(), 2, writeInfos, 0, nullptr);
vk::RefCounted<vk::ShaderAndSerial> *shader = nullptr;
ANGLE_TRY(
contextVk->getShaderLibrary().getResolveStencilNoExport_comp(contextVk, flags, &shader));
ANGLE_TRY(setupProgram(contextVk, Function::ResolveStencilNoExport, shader, nullptr,
&mResolveStencilNoExportPrograms[flags], nullptr, descriptorSet,
&shaderParams, sizeof(shaderParams), commandBuffer));
commandBuffer->dispatch(UnsignedCeilDivide(bufferRowLengthInUints, 8),
UnsignedCeilDivide(params.resolveArea.height, 8), 1);
descriptorPoolBinding.reset();
// Add a barrier prior to copy.
VkMemoryBarrier memoryBarrier = {};
memoryBarrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
memoryBarrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
memoryBarrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
// Use the all pipe stage to keep the state management simple.
commandBuffer->pipelineBarrier(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT,
VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1, &memoryBarrier, 0, nullptr,
0, nullptr);
// Copy the resolved buffer into dest.
RenderTargetVk *depthStencilRenderTarget = framebuffer->getDepthStencilRenderTarget();
ASSERT(depthStencilRenderTarget != nullptr);
vk::ImageHelper *depthStencilImage = &depthStencilRenderTarget->getImage();
depthStencilImage->changeLayout(depthStencilImage->getAspectFlags(),
vk::ImageLayout::TransferDst, commandBuffer);
VkBufferImageCopy region = {};
region.bufferOffset = 0;
region.bufferRowLength = bufferRowLengthInUints * sizeof(uint32_t);
region.bufferImageHeight = params.resolveArea.height;
region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
region.imageSubresource.mipLevel = depthStencilRenderTarget->getLevelIndex();
region.imageSubresource.baseArrayLayer = depthStencilRenderTarget->getLayerIndex();
region.imageSubresource.layerCount = 1;
region.imageOffset.x = params.resolveArea.x;
region.imageOffset.y = params.resolveArea.y;
region.imageOffset.z = 0;
region.imageExtent.width = params.resolveArea.width;
region.imageExtent.height = params.resolveArea.height;
region.imageExtent.depth = 1;
commandBuffer->copyBufferToImage(resolveBuffer.get().getBuffer().getHandle(),
depthStencilImage->getImage(),
depthStencilImage->getCurrentLayout(), 1, &region);
resolveBuffer.get().release(contextVk);
return angle::Result::Continue;
}
angle::Result UtilsVk::copyImage(ContextVk *contextVk, angle::Result UtilsVk::copyImage(ContextVk *contextVk,
vk::ImageHelper *dest, vk::ImageHelper *dest,
const vk::ImageView *destView, const vk::ImageView *destView,
......
...@@ -138,6 +138,11 @@ class UtilsVk : angle::NonCopyable ...@@ -138,6 +138,11 @@ class UtilsVk : angle::NonCopyable
const vk::ImageView *srcDepthView, const vk::ImageView *srcDepthView,
const vk::ImageView *srcStencilView, const vk::ImageView *srcStencilView,
const ResolveParameters &params); const ResolveParameters &params);
angle::Result stencilResolveNoShaderExport(ContextVk *contextVk,
FramebufferVk *framebuffer,
vk::ImageHelper *src,
const vk::ImageView *srcStencilView,
const ResolveParameters &params);
angle::Result copyImage(ContextVk *contextVk, angle::Result copyImage(ContextVk *contextVk,
vk::ImageHelper *dest, vk::ImageHelper *dest,
...@@ -215,7 +220,7 @@ class UtilsVk : angle::NonCopyable ...@@ -215,7 +220,7 @@ class UtilsVk : angle::NonCopyable
struct ResolveDepthStencilShaderParams struct ResolveDepthStencilShaderParams
{ {
// Structure matching PushConstants in ResolvedDepthStencil.frag // Structure matching PushConstants in ResolveDepthStencil.frag
int32_t srcExtent[2] = {}; int32_t srcExtent[2] = {};
int32_t srcOffset[2] = {}; int32_t srcOffset[2] = {};
int32_t destOffset[2] = {}; int32_t destOffset[2] = {};
...@@ -224,6 +229,18 @@ class UtilsVk : angle::NonCopyable ...@@ -224,6 +229,18 @@ class UtilsVk : angle::NonCopyable
uint32_t flipY = 0; uint32_t flipY = 0;
}; };
struct ResolveStencilNoExportShaderParams
{
// Structure matching PushConstants in ResolveStencilNoExport.comp
int32_t srcExtent[2] = {};
int32_t srcOffset[2] = {};
int32_t srcLayer = 0;
int32_t destPitch = 0;
int32_t destExtent[2] = {};
uint32_t flipX = 0;
uint32_t flipY = 0;
};
// Functions implemented by the class: // Functions implemented by the class:
enum class Function enum class Function
{ {
...@@ -234,13 +251,14 @@ class UtilsVk : angle::NonCopyable ...@@ -234,13 +251,14 @@ class UtilsVk : angle::NonCopyable
ResolveDepthStencil = 3, ResolveDepthStencil = 3,
// Functions implemented in compute // Functions implemented in compute
ComputeStartIndex = 4, // Special value to separate draw and dispatch functions. ComputeStartIndex = 4, // Special value to separate draw and dispatch functions.
BufferClear = 4, BufferClear = 4,
BufferCopy = 5, BufferCopy = 5,
ConvertVertexBuffer = 6, ConvertVertexBuffer = 6,
ResolveStencilNoExport = 7,
InvalidEnum = 7,
EnumCount = 7, InvalidEnum = 8,
EnumCount = 8,
}; };
// Common function that creates the pipeline for the specified function, binds it and prepares // Common function that creates the pipeline for the specified function, binds it and prepares
...@@ -279,6 +297,7 @@ class UtilsVk : angle::NonCopyable ...@@ -279,6 +297,7 @@ class UtilsVk : angle::NonCopyable
angle::Result ensureImageCopyResourcesInitialized(ContextVk *context); angle::Result ensureImageCopyResourcesInitialized(ContextVk *context);
angle::Result ensureResolveColorResourcesInitialized(ContextVk *context); angle::Result ensureResolveColorResourcesInitialized(ContextVk *context);
angle::Result ensureResolveDepthStencilResourcesInitialized(ContextVk *context); angle::Result ensureResolveDepthStencilResourcesInitialized(ContextVk *context);
angle::Result ensureResolveStencilNoExportResourcesInitialized(ContextVk *context);
angle::Result startRenderPass(ContextVk *contextVk, angle::Result startRenderPass(ContextVk *contextVk,
vk::ImageHelper *image, vk::ImageHelper *image,
...@@ -311,6 +330,8 @@ class UtilsVk : angle::NonCopyable ...@@ -311,6 +330,8 @@ class UtilsVk : angle::NonCopyable
vk::ShaderProgramHelper vk::ShaderProgramHelper
mResolveDepthStencilPrograms[vk::InternalShader::ResolveDepthStencil_frag::kFlagsMask | mResolveDepthStencilPrograms[vk::InternalShader::ResolveDepthStencil_frag::kFlagsMask |
vk::InternalShader::ResolveDepthStencil_frag::kResolveMask]; vk::InternalShader::ResolveDepthStencil_frag::kResolveMask];
vk::ShaderProgramHelper mResolveStencilNoExportPrograms
[vk::InternalShader::ResolveStencilNoExport_comp::kFlagsMask];
}; };
} // namespace rx } // namespace rx
......
// 7.12.3226
#pragma once
const uint32_t kResolveStencilNoExport_comp_00000000[] = {
0x07230203,0x00010000,0x00080007,0x0000009f,0x00000000,0x00020011,0x00000001,0x0006000b,
0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
0x0006000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x0000000d,0x00060010,0x00000004,
0x00000011,0x00000008,0x00000008,0x00000001,0x00030003,0x00000002,0x000001c2,0x000b0004,
0x455f4c47,0x735f5458,0x6c706d61,0x656c7265,0x745f7373,0x75747865,0x665f6572,0x74636e75,
0x736e6f69,0x00000000,0x00040005,0x00000004,0x6e69616d,0x00000000,0x00070005,0x00000009,
0x74736564,0x49627553,0x6567616d,0x726f6f43,0x00007364,0x00080005,0x0000000d,0x475f6c67,
0x61626f6c,0x766e496c,0x7461636f,0x496e6f69,0x00000044,0x00060005,0x0000001a,0x68737550,
0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000001a,0x00000000,0x45637273,0x6e657478,
0x00000074,0x00060006,0x0000001a,0x00000001,0x4f637273,0x65736666,0x00000074,0x00060006,
0x0000001a,0x00000002,0x4c637273,0x72657961,0x00000000,0x00060006,0x0000001a,0x00000003,
0x74736564,0x63746950,0x00000068,0x00060006,0x0000001a,0x00000004,0x74736564,0x65747845,
0x0000746e,0x00050006,0x0000001a,0x00000005,0x70696c66,0x00000058,0x00050006,0x0000001a,
0x00000006,0x70696c66,0x00000059,0x00040005,0x0000001c,0x61726170,0x0000736d,0x00070005,
0x00000029,0x53637273,0x6d496275,0x43656761,0x64726f6f,0x00000073,0x00060005,0x00000041,
0x49637273,0x6567616d,0x726f6f43,0x00007364,0x00040005,0x00000047,0x72694478,0x00000000,
0x00050005,0x0000004e,0x5374756f,0x636e6574,0x00736c69,0x00030005,0x0000005e,0x00000069,
0x00060005,0x00000066,0x6e657473,0x566c6963,0x65756c61,0x00000000,0x00040005,0x00000076,
0x6e657473,0x006c6963,0x00040005,0x0000008d,0x74736564,0x00000000,0x00060006,0x0000008d,
0x00000000,0x74736564,0x61746144,0x00000000,0x00030005,0x0000008f,0x00000000,0x00040047,
0x0000000d,0x0000000b,0x0000001c,0x00050048,0x0000001a,0x00000000,0x00000023,0x00000000,
0x00050048,0x0000001a,0x00000001,0x00000023,0x00000008,0x00050048,0x0000001a,0x00000002,
0x00000023,0x00000010,0x00050048,0x0000001a,0x00000003,0x00000023,0x00000014,0x00050048,
0x0000001a,0x00000004,0x00000023,0x00000018,0x00050048,0x0000001a,0x00000005,0x00000023,
0x00000020,0x00050048,0x0000001a,0x00000006,0x00000023,0x00000024,0x00030047,0x0000001a,
0x00000002,0x00040047,0x00000076,0x00000022,0x00000000,0x00040047,0x00000076,0x00000021,
0x00000001,0x00040047,0x0000008c,0x00000006,0x00000004,0x00050048,0x0000008d,0x00000000,
0x00000023,0x00000000,0x00030047,0x0000008d,0x00000003,0x00040047,0x0000008f,0x00000022,
0x00000000,0x00040047,0x0000008f,0x00000021,0x00000000,0x00040047,0x0000009e,0x0000000b,
0x00000019,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,
0x00000020,0x00000001,0x00040017,0x00000007,0x00000006,0x00000002,0x00040020,0x00000008,
0x00000007,0x00000007,0x00040015,0x0000000a,0x00000020,0x00000000,0x00040017,0x0000000b,
0x0000000a,0x00000003,0x00040020,0x0000000c,0x00000001,0x0000000b,0x0004003b,0x0000000c,
0x0000000d,0x00000001,0x0004002b,0x0000000a,0x0000000e,0x00000000,0x00040020,0x0000000f,
0x00000001,0x0000000a,0x0004002b,0x0000000a,0x00000012,0x00000004,0x0004002b,0x0000000a,
0x00000015,0x00000001,0x0009001e,0x0000001a,0x00000007,0x00000007,0x00000006,0x00000006,
0x00000007,0x0000000a,0x0000000a,0x00040020,0x0000001b,0x00000009,0x0000001a,0x0004003b,
0x0000001b,0x0000001c,0x00000009,0x0004002b,0x00000006,0x0000001d,0x00000004,0x00040020,
0x0000001e,0x00000009,0x00000007,0x00020014,0x00000022,0x00040017,0x00000023,0x00000022,
0x00000002,0x0004002b,0x00000006,0x0000002b,0x00000005,0x00040020,0x0000002c,0x00000009,
0x0000000a,0x00040020,0x00000032,0x00000007,0x00000006,0x0004002b,0x00000006,0x00000037,
0x00000006,0x0004002b,0x00000006,0x00000042,0x00000001,0x0004002b,0x00000006,0x0000004b,
0xffffffff,0x00040020,0x0000004d,0x00000007,0x0000000a,0x0004002b,0x00000006,0x00000051,
0x00000000,0x00040020,0x00000057,0x00000009,0x00000006,0x00090019,0x00000074,0x0000000a,
0x00000001,0x00000000,0x00000000,0x00000001,0x00000001,0x00000000,0x00040020,0x00000075,
0x00000000,0x00000074,0x0004003b,0x00000075,0x00000076,0x00000000,0x00040017,0x00000079,
0x0000000a,0x00000004,0x0004002b,0x0000000a,0x0000007d,0x000000ff,0x0004002b,0x00000006,
0x00000080,0x00000008,0x0003001d,0x0000008c,0x0000000a,0x0003001e,0x0000008d,0x0000008c,
0x00040020,0x0000008e,0x00000002,0x0000008d,0x0004003b,0x0000008e,0x0000008f,0x00000002,
0x0004002b,0x00000006,0x00000092,0x00000003,0x00040020,0x0000009b,0x00000002,0x0000000a,
0x0004002b,0x0000000a,0x0000009d,0x00000008,0x0006002c,0x0000000b,0x0000009e,0x0000009d,
0x0000009d,0x00000015,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,
0x00000005,0x0004003b,0x00000008,0x00000009,0x00000007,0x0004003b,0x00000008,0x00000029,
0x00000007,0x0004003b,0x00000008,0x00000041,0x00000007,0x0004003b,0x00000032,0x00000047,
0x00000007,0x0004003b,0x0000004d,0x0000004e,0x00000007,0x0004003b,0x00000032,0x0000005e,
0x00000007,0x0004003b,0x0000004d,0x00000066,0x00000007,0x00050041,0x0000000f,0x00000010,
0x0000000d,0x0000000e,0x0004003d,0x0000000a,0x00000011,0x00000010,0x00050084,0x0000000a,
0x00000013,0x00000011,0x00000012,0x0004007c,0x00000006,0x00000014,0x00000013,0x00050041,
0x0000000f,0x00000016,0x0000000d,0x00000015,0x0004003d,0x0000000a,0x00000017,0x00000016,
0x0004007c,0x00000006,0x00000018,0x00000017,0x00050050,0x00000007,0x00000019,0x00000014,
0x00000018,0x0003003e,0x00000009,0x00000019,0x00050041,0x0000001e,0x0000001f,0x0000001c,
0x0000001d,0x0004003d,0x00000007,0x00000020,0x0000001f,0x0004003d,0x00000007,0x00000021,
0x00000009,0x000500b3,0x00000023,0x00000024,0x00000020,0x00000021,0x0004009a,0x00000022,
0x00000025,0x00000024,0x000300f7,0x00000027,0x00000000,0x000400fa,0x00000025,0x00000026,
0x00000027,0x000200f8,0x00000026,0x000100fd,0x000200f8,0x00000027,0x0004003d,0x00000007,
0x0000002a,0x00000009,0x0003003e,0x00000029,0x0000002a,0x00050041,0x0000002c,0x0000002d,
0x0000001c,0x0000002b,0x0004003d,0x0000000a,0x0000002e,0x0000002d,0x000500ab,0x00000022,
0x0000002f,0x0000002e,0x0000000e,0x000300f7,0x00000031,0x00000000,0x000400fa,0x0000002f,
0x00000030,0x00000031,0x000200f8,0x00000030,0x00050041,0x00000032,0x00000033,0x00000029,
0x0000000e,0x0004003d,0x00000006,0x00000034,0x00000033,0x0004007e,0x00000006,0x00000035,
0x00000034,0x00050041,0x00000032,0x00000036,0x00000029,0x0000000e,0x0003003e,0x00000036,
0x00000035,0x000200f9,0x00000031,0x000200f8,0x00000031,0x00050041,0x0000002c,0x00000038,
0x0000001c,0x00000037,0x0004003d,0x0000000a,0x00000039,0x00000038,0x000500ab,0x00000022,
0x0000003a,0x00000039,0x0000000e,0x000300f7,0x0000003c,0x00000000,0x000400fa,0x0000003a,
0x0000003b,0x0000003c,0x000200f8,0x0000003b,0x00050041,0x00000032,0x0000003d,0x00000029,
0x00000015,0x0004003d,0x00000006,0x0000003e,0x0000003d,0x0004007e,0x00000006,0x0000003f,
0x0000003e,0x00050041,0x00000032,0x00000040,0x00000029,0x00000015,0x0003003e,0x00000040,
0x0000003f,0x000200f9,0x0000003c,0x000200f8,0x0000003c,0x00050041,0x0000001e,0x00000043,
0x0000001c,0x00000042,0x0004003d,0x00000007,0x00000044,0x00000043,0x0004003d,0x00000007,
0x00000045,0x00000029,0x00050080,0x00000007,0x00000046,0x00000044,0x00000045,0x0003003e,
0x00000041,0x00000046,0x00050041,0x0000002c,0x00000048,0x0000001c,0x0000002b,0x0004003d,
0x0000000a,0x00000049,0x00000048,0x000500ab,0x00000022,0x0000004a,0x00000049,0x0000000e,
0x000600a9,0x00000006,0x0000004c,0x0000004a,0x0000004b,0x00000042,0x0003003e,0x00000047,
0x0000004c,0x0003003e,0x0000004e,0x0000000e,0x00050041,0x00000032,0x0000004f,0x00000041,
0x00000015,0x0004003d,0x00000006,0x00000050,0x0000004f,0x000500af,0x00000022,0x00000052,
0x00000050,0x00000051,0x000300f7,0x00000054,0x00000000,0x000400fa,0x00000052,0x00000053,
0x00000054,0x000200f8,0x00000053,0x00050041,0x00000032,0x00000055,0x00000041,0x00000015,
0x0004003d,0x00000006,0x00000056,0x00000055,0x00060041,0x00000057,0x00000058,0x0000001c,
0x00000051,0x00000015,0x0004003d,0x00000006,0x00000059,0x00000058,0x000500b1,0x00000022,
0x0000005a,0x00000056,0x00000059,0x000200f9,0x00000054,0x000200f8,0x00000054,0x000700f5,
0x00000022,0x0000005b,0x00000052,0x0000003c,0x0000005a,0x00000053,0x000300f7,0x0000005d,
0x00000000,0x000400fa,0x0000005b,0x0000005c,0x0000005d,0x000200f8,0x0000005c,0x0003003e,
0x0000005e,0x00000051,0x000200f9,0x0000005f,0x000200f8,0x0000005f,0x000400f6,0x00000061,
0x00000062,0x00000000,0x000200f9,0x00000063,0x000200f8,0x00000063,0x0004003d,0x00000006,
0x00000064,0x0000005e,0x000500b1,0x00000022,0x00000065,0x00000064,0x0000001d,0x000400fa,
0x00000065,0x00000060,0x00000061,0x000200f8,0x00000060,0x0003003e,0x00000066,0x0000000e,
0x00050041,0x00000032,0x00000067,0x00000041,0x0000000e,0x0004003d,0x00000006,0x00000068,
0x00000067,0x000500af,0x00000022,0x00000069,0x00000068,0x00000051,0x000300f7,0x0000006b,
0x00000000,0x000400fa,0x00000069,0x0000006a,0x0000006b,0x000200f8,0x0000006a,0x00050041,
0x00000032,0x0000006c,0x00000041,0x0000000e,0x0004003d,0x00000006,0x0000006d,0x0000006c,
0x00060041,0x00000057,0x0000006e,0x0000001c,0x00000051,0x0000000e,0x0004003d,0x00000006,
0x0000006f,0x0000006e,0x000500b1,0x00000022,0x00000070,0x0000006d,0x0000006f,0x000200f9,
0x0000006b,0x000200f8,0x0000006b,0x000700f5,0x00000022,0x00000071,0x00000069,0x00000060,
0x00000070,0x0000006a,0x000300f7,0x00000073,0x00000000,0x000400fa,0x00000071,0x00000072,
0x00000073,0x000200f8,0x00000072,0x0004003d,0x00000074,0x00000077,0x00000076,0x0004003d,
0x00000007,0x00000078,0x00000041,0x0007005f,0x00000079,0x0000007a,0x00000077,0x00000078,
0x00000040,0x00000051,0x00050051,0x0000000a,0x0000007b,0x0000007a,0x00000000,0x0003003e,
0x00000066,0x0000007b,0x0004003d,0x0000000a,0x0000007c,0x00000066,0x000500c7,0x0000000a,
0x0000007e,0x0000007c,0x0000007d,0x0004003d,0x00000006,0x0000007f,0x0000005e,0x00050084,
0x00000006,0x00000081,0x0000007f,0x00000080,0x000500c4,0x0000000a,0x00000082,0x0000007e,
0x00000081,0x0004003d,0x0000000a,0x00000083,0x0000004e,0x000500c5,0x0000000a,0x00000084,
0x00000083,0x00000082,0x0003003e,0x0000004e,0x00000084,0x000200f9,0x00000073,0x000200f8,
0x00000073,0x0004003d,0x00000006,0x00000085,0x00000047,0x00050041,0x00000032,0x00000086,
0x00000041,0x0000000e,0x0004003d,0x00000006,0x00000087,0x00000086,0x00050080,0x00000006,
0x00000088,0x00000087,0x00000085,0x00050041,0x00000032,0x00000089,0x00000041,0x0000000e,
0x0003003e,0x00000089,0x00000088,0x000200f9,0x00000062,0x000200f8,0x00000062,0x0004003d,
0x00000006,0x0000008a,0x0000005e,0x00050080,0x00000006,0x0000008b,0x0000008a,0x00000042,
0x0003003e,0x0000005e,0x0000008b,0x000200f9,0x0000005f,0x000200f8,0x00000061,0x000200f9,
0x0000005d,0x000200f8,0x0000005d,0x00050041,0x0000000f,0x00000090,0x0000000d,0x00000015,
0x0004003d,0x0000000a,0x00000091,0x00000090,0x00050041,0x00000057,0x00000093,0x0000001c,
0x00000092,0x0004003d,0x00000006,0x00000094,0x00000093,0x0004007c,0x0000000a,0x00000095,
0x00000094,0x00050084,0x0000000a,0x00000096,0x00000091,0x00000095,0x00050041,0x0000000f,
0x00000097,0x0000000d,0x0000000e,0x0004003d,0x0000000a,0x00000098,0x00000097,0x00050080,
0x0000000a,0x00000099,0x00000096,0x00000098,0x0004003d,0x0000000a,0x0000009a,0x0000004e,
0x00060041,0x0000009b,0x0000009c,0x0000008f,0x00000051,0x00000099,0x0003003e,0x0000009c,
0x0000009a,0x000100fd,0x00010038
};
#if 0 // Generated from:
#version 450 core
#extension GL_EXT_samplerless_texture_functions : require
layout(local_size_x = 8, local_size_y = 8, local_size_z = 1)in;
layout(set = 0, binding = 0)buffer dest
{
uint destData[];
};
layout(push_constant)uniform PushConstants {
ivec2 srcExtent;
ivec2 srcOffset;
int srcLayer;
int destPitch;
ivec2 destExtent;
bool flipX;
bool flipY;
} params;
layout(set = 0, binding = 1)uniform utexture2DMS stencil;
void main()
{
ivec2 destSubImageCoords = ivec2(gl_GlobalInvocationID . x * 4, gl_GlobalInvocationID . y);
if(any(lessThanEqual(params . destExtent, destSubImageCoords)))
{
return;
}
ivec2 srcSubImageCoords = destSubImageCoords;
if(params . flipX)
srcSubImageCoords . x = - srcSubImageCoords . x;
if(params . flipY)
srcSubImageCoords . y = - srcSubImageCoords . y;
ivec2 srcImageCoords = params . srcOffset + srcSubImageCoords;
int xDir = params . flipX ? - 1 : 1;
uint outStencils = 0;
if(srcImageCoords . y >= 0 && srcImageCoords . y < params . srcExtent . y)
{
for(int i = 0;i < 4;++ i)
{
uint stencilValue = 0;
if(srcImageCoords . x >= 0 && srcImageCoords . x < params . srcExtent . x)
{
stencilValue = texelFetch(stencil, srcImageCoords, 0). x;
outStencils |=(stencilValue & 0xFF)<<(i * 8);
}
srcImageCoords . x += xDir;
}
}
destData[gl_GlobalInvocationID . y * params . destPitch + gl_GlobalInvocationID . x]= outStencils;
}
#endif // Preprocessed code
// 7.12.3226
#pragma once
const uint32_t kResolveStencilNoExport_comp_00000001[] = {
0x07230203,0x00010000,0x00080007,0x000000a6,0x00000000,0x00020011,0x00000001,0x0006000b,
0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
0x0006000f,0x00000005,0x00000004,0x6e69616d,0x00000000,0x0000000d,0x00060010,0x00000004,
0x00000011,0x00000008,0x00000008,0x00000001,0x00030003,0x00000002,0x000001c2,0x000b0004,
0x455f4c47,0x735f5458,0x6c706d61,0x656c7265,0x745f7373,0x75747865,0x665f6572,0x74636e75,
0x736e6f69,0x00000000,0x00040005,0x00000004,0x6e69616d,0x00000000,0x00070005,0x00000009,
0x74736564,0x49627553,0x6567616d,0x726f6f43,0x00007364,0x00080005,0x0000000d,0x475f6c67,
0x61626f6c,0x766e496c,0x7461636f,0x496e6f69,0x00000044,0x00060005,0x0000001a,0x68737550,
0x736e6f43,0x746e6174,0x00000073,0x00060006,0x0000001a,0x00000000,0x45637273,0x6e657478,
0x00000074,0x00060006,0x0000001a,0x00000001,0x4f637273,0x65736666,0x00000074,0x00060006,
0x0000001a,0x00000002,0x4c637273,0x72657961,0x00000000,0x00060006,0x0000001a,0x00000003,
0x74736564,0x63746950,0x00000068,0x00060006,0x0000001a,0x00000004,0x74736564,0x65747845,
0x0000746e,0x00050006,0x0000001a,0x00000005,0x70696c66,0x00000058,0x00050006,0x0000001a,
0x00000006,0x70696c66,0x00000059,0x00040005,0x0000001c,0x61726170,0x0000736d,0x00070005,
0x00000029,0x53637273,0x6d496275,0x43656761,0x64726f6f,0x00000073,0x00060005,0x00000041,
0x49637273,0x6567616d,0x726f6f43,0x00007364,0x00040005,0x00000047,0x72694478,0x00000000,
0x00050005,0x0000004e,0x5374756f,0x636e6574,0x00736c69,0x00030005,0x0000005e,0x00000069,
0x00060005,0x00000066,0x6e657473,0x566c6963,0x65756c61,0x00000000,0x00040005,0x00000076,
0x6e657473,0x006c6963,0x00040005,0x00000094,0x74736564,0x00000000,0x00060006,0x00000094,
0x00000000,0x74736564,0x61746144,0x00000000,0x00030005,0x00000096,0x00000000,0x00040047,
0x0000000d,0x0000000b,0x0000001c,0x00050048,0x0000001a,0x00000000,0x00000023,0x00000000,
0x00050048,0x0000001a,0x00000001,0x00000023,0x00000008,0x00050048,0x0000001a,0x00000002,
0x00000023,0x00000010,0x00050048,0x0000001a,0x00000003,0x00000023,0x00000014,0x00050048,
0x0000001a,0x00000004,0x00000023,0x00000018,0x00050048,0x0000001a,0x00000005,0x00000023,
0x00000020,0x00050048,0x0000001a,0x00000006,0x00000023,0x00000024,0x00030047,0x0000001a,
0x00000002,0x00040047,0x00000076,0x00000022,0x00000000,0x00040047,0x00000076,0x00000021,
0x00000001,0x00040047,0x00000093,0x00000006,0x00000004,0x00050048,0x00000094,0x00000000,
0x00000023,0x00000000,0x00030047,0x00000094,0x00000003,0x00040047,0x00000096,0x00000022,
0x00000000,0x00040047,0x00000096,0x00000021,0x00000000,0x00040047,0x000000a5,0x0000000b,
0x00000019,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,
0x00000020,0x00000001,0x00040017,0x00000007,0x00000006,0x00000002,0x00040020,0x00000008,
0x00000007,0x00000007,0x00040015,0x0000000a,0x00000020,0x00000000,0x00040017,0x0000000b,
0x0000000a,0x00000003,0x00040020,0x0000000c,0x00000001,0x0000000b,0x0004003b,0x0000000c,
0x0000000d,0x00000001,0x0004002b,0x0000000a,0x0000000e,0x00000000,0x00040020,0x0000000f,
0x00000001,0x0000000a,0x0004002b,0x0000000a,0x00000012,0x00000004,0x0004002b,0x0000000a,
0x00000015,0x00000001,0x0009001e,0x0000001a,0x00000007,0x00000007,0x00000006,0x00000006,
0x00000007,0x0000000a,0x0000000a,0x00040020,0x0000001b,0x00000009,0x0000001a,0x0004003b,
0x0000001b,0x0000001c,0x00000009,0x0004002b,0x00000006,0x0000001d,0x00000004,0x00040020,
0x0000001e,0x00000009,0x00000007,0x00020014,0x00000022,0x00040017,0x00000023,0x00000022,
0x00000002,0x0004002b,0x00000006,0x0000002b,0x00000005,0x00040020,0x0000002c,0x00000009,
0x0000000a,0x00040020,0x00000032,0x00000007,0x00000006,0x0004002b,0x00000006,0x00000037,
0x00000006,0x0004002b,0x00000006,0x00000042,0x00000001,0x0004002b,0x00000006,0x0000004b,
0xffffffff,0x00040020,0x0000004d,0x00000007,0x0000000a,0x0004002b,0x00000006,0x00000051,
0x00000000,0x00040020,0x00000057,0x00000009,0x00000006,0x00090019,0x00000074,0x0000000a,
0x00000001,0x00000000,0x00000001,0x00000001,0x00000001,0x00000000,0x00040020,0x00000075,
0x00000000,0x00000074,0x0004003b,0x00000075,0x00000076,0x00000000,0x0004002b,0x00000006,
0x00000079,0x00000002,0x00040017,0x0000007c,0x00000006,0x00000003,0x00040017,0x00000080,
0x0000000a,0x00000004,0x0004002b,0x0000000a,0x00000084,0x000000ff,0x0004002b,0x00000006,
0x00000087,0x00000008,0x0003001d,0x00000093,0x0000000a,0x0003001e,0x00000094,0x00000093,
0x00040020,0x00000095,0x00000002,0x00000094,0x0004003b,0x00000095,0x00000096,0x00000002,
0x0004002b,0x00000006,0x00000099,0x00000003,0x00040020,0x000000a2,0x00000002,0x0000000a,
0x0004002b,0x0000000a,0x000000a4,0x00000008,0x0006002c,0x0000000b,0x000000a5,0x000000a4,
0x000000a4,0x00000015,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,
0x00000005,0x0004003b,0x00000008,0x00000009,0x00000007,0x0004003b,0x00000008,0x00000029,
0x00000007,0x0004003b,0x00000008,0x00000041,0x00000007,0x0004003b,0x00000032,0x00000047,
0x00000007,0x0004003b,0x0000004d,0x0000004e,0x00000007,0x0004003b,0x00000032,0x0000005e,
0x00000007,0x0004003b,0x0000004d,0x00000066,0x00000007,0x00050041,0x0000000f,0x00000010,
0x0000000d,0x0000000e,0x0004003d,0x0000000a,0x00000011,0x00000010,0x00050084,0x0000000a,
0x00000013,0x00000011,0x00000012,0x0004007c,0x00000006,0x00000014,0x00000013,0x00050041,
0x0000000f,0x00000016,0x0000000d,0x00000015,0x0004003d,0x0000000a,0x00000017,0x00000016,
0x0004007c,0x00000006,0x00000018,0x00000017,0x00050050,0x00000007,0x00000019,0x00000014,
0x00000018,0x0003003e,0x00000009,0x00000019,0x00050041,0x0000001e,0x0000001f,0x0000001c,
0x0000001d,0x0004003d,0x00000007,0x00000020,0x0000001f,0x0004003d,0x00000007,0x00000021,
0x00000009,0x000500b3,0x00000023,0x00000024,0x00000020,0x00000021,0x0004009a,0x00000022,
0x00000025,0x00000024,0x000300f7,0x00000027,0x00000000,0x000400fa,0x00000025,0x00000026,
0x00000027,0x000200f8,0x00000026,0x000100fd,0x000200f8,0x00000027,0x0004003d,0x00000007,
0x0000002a,0x00000009,0x0003003e,0x00000029,0x0000002a,0x00050041,0x0000002c,0x0000002d,
0x0000001c,0x0000002b,0x0004003d,0x0000000a,0x0000002e,0x0000002d,0x000500ab,0x00000022,
0x0000002f,0x0000002e,0x0000000e,0x000300f7,0x00000031,0x00000000,0x000400fa,0x0000002f,
0x00000030,0x00000031,0x000200f8,0x00000030,0x00050041,0x00000032,0x00000033,0x00000029,
0x0000000e,0x0004003d,0x00000006,0x00000034,0x00000033,0x0004007e,0x00000006,0x00000035,
0x00000034,0x00050041,0x00000032,0x00000036,0x00000029,0x0000000e,0x0003003e,0x00000036,
0x00000035,0x000200f9,0x00000031,0x000200f8,0x00000031,0x00050041,0x0000002c,0x00000038,
0x0000001c,0x00000037,0x0004003d,0x0000000a,0x00000039,0x00000038,0x000500ab,0x00000022,
0x0000003a,0x00000039,0x0000000e,0x000300f7,0x0000003c,0x00000000,0x000400fa,0x0000003a,
0x0000003b,0x0000003c,0x000200f8,0x0000003b,0x00050041,0x00000032,0x0000003d,0x00000029,
0x00000015,0x0004003d,0x00000006,0x0000003e,0x0000003d,0x0004007e,0x00000006,0x0000003f,
0x0000003e,0x00050041,0x00000032,0x00000040,0x00000029,0x00000015,0x0003003e,0x00000040,
0x0000003f,0x000200f9,0x0000003c,0x000200f8,0x0000003c,0x00050041,0x0000001e,0x00000043,
0x0000001c,0x00000042,0x0004003d,0x00000007,0x00000044,0x00000043,0x0004003d,0x00000007,
0x00000045,0x00000029,0x00050080,0x00000007,0x00000046,0x00000044,0x00000045,0x0003003e,
0x00000041,0x00000046,0x00050041,0x0000002c,0x00000048,0x0000001c,0x0000002b,0x0004003d,
0x0000000a,0x00000049,0x00000048,0x000500ab,0x00000022,0x0000004a,0x00000049,0x0000000e,
0x000600a9,0x00000006,0x0000004c,0x0000004a,0x0000004b,0x00000042,0x0003003e,0x00000047,
0x0000004c,0x0003003e,0x0000004e,0x0000000e,0x00050041,0x00000032,0x0000004f,0x00000041,
0x00000015,0x0004003d,0x00000006,0x00000050,0x0000004f,0x000500af,0x00000022,0x00000052,
0x00000050,0x00000051,0x000300f7,0x00000054,0x00000000,0x000400fa,0x00000052,0x00000053,
0x00000054,0x000200f8,0x00000053,0x00050041,0x00000032,0x00000055,0x00000041,0x00000015,
0x0004003d,0x00000006,0x00000056,0x00000055,0x00060041,0x00000057,0x00000058,0x0000001c,
0x00000051,0x00000015,0x0004003d,0x00000006,0x00000059,0x00000058,0x000500b1,0x00000022,
0x0000005a,0x00000056,0x00000059,0x000200f9,0x00000054,0x000200f8,0x00000054,0x000700f5,
0x00000022,0x0000005b,0x00000052,0x0000003c,0x0000005a,0x00000053,0x000300f7,0x0000005d,
0x00000000,0x000400fa,0x0000005b,0x0000005c,0x0000005d,0x000200f8,0x0000005c,0x0003003e,
0x0000005e,0x00000051,0x000200f9,0x0000005f,0x000200f8,0x0000005f,0x000400f6,0x00000061,
0x00000062,0x00000000,0x000200f9,0x00000063,0x000200f8,0x00000063,0x0004003d,0x00000006,
0x00000064,0x0000005e,0x000500b1,0x00000022,0x00000065,0x00000064,0x0000001d,0x000400fa,
0x00000065,0x00000060,0x00000061,0x000200f8,0x00000060,0x0003003e,0x00000066,0x0000000e,
0x00050041,0x00000032,0x00000067,0x00000041,0x0000000e,0x0004003d,0x00000006,0x00000068,
0x00000067,0x000500af,0x00000022,0x00000069,0x00000068,0x00000051,0x000300f7,0x0000006b,
0x00000000,0x000400fa,0x00000069,0x0000006a,0x0000006b,0x000200f8,0x0000006a,0x00050041,
0x00000032,0x0000006c,0x00000041,0x0000000e,0x0004003d,0x00000006,0x0000006d,0x0000006c,
0x00060041,0x00000057,0x0000006e,0x0000001c,0x00000051,0x0000000e,0x0004003d,0x00000006,
0x0000006f,0x0000006e,0x000500b1,0x00000022,0x00000070,0x0000006d,0x0000006f,0x000200f9,
0x0000006b,0x000200f8,0x0000006b,0x000700f5,0x00000022,0x00000071,0x00000069,0x00000060,
0x00000070,0x0000006a,0x000300f7,0x00000073,0x00000000,0x000400fa,0x00000071,0x00000072,
0x00000073,0x000200f8,0x00000072,0x0004003d,0x00000074,0x00000077,0x00000076,0x0004003d,
0x00000007,0x00000078,0x00000041,0x00050041,0x00000057,0x0000007a,0x0000001c,0x00000079,
0x0004003d,0x00000006,0x0000007b,0x0000007a,0x00050051,0x00000006,0x0000007d,0x00000078,
0x00000000,0x00050051,0x00000006,0x0000007e,0x00000078,0x00000001,0x00060050,0x0000007c,
0x0000007f,0x0000007d,0x0000007e,0x0000007b,0x0007005f,0x00000080,0x00000081,0x00000077,
0x0000007f,0x00000040,0x00000051,0x00050051,0x0000000a,0x00000082,0x00000081,0x00000000,
0x0003003e,0x00000066,0x00000082,0x0004003d,0x0000000a,0x00000083,0x00000066,0x000500c7,
0x0000000a,0x00000085,0x00000083,0x00000084,0x0004003d,0x00000006,0x00000086,0x0000005e,
0x00050084,0x00000006,0x00000088,0x00000086,0x00000087,0x000500c4,0x0000000a,0x00000089,
0x00000085,0x00000088,0x0004003d,0x0000000a,0x0000008a,0x0000004e,0x000500c5,0x0000000a,
0x0000008b,0x0000008a,0x00000089,0x0003003e,0x0000004e,0x0000008b,0x000200f9,0x00000073,
0x000200f8,0x00000073,0x0004003d,0x00000006,0x0000008c,0x00000047,0x00050041,0x00000032,
0x0000008d,0x00000041,0x0000000e,0x0004003d,0x00000006,0x0000008e,0x0000008d,0x00050080,
0x00000006,0x0000008f,0x0000008e,0x0000008c,0x00050041,0x00000032,0x00000090,0x00000041,
0x0000000e,0x0003003e,0x00000090,0x0000008f,0x000200f9,0x00000062,0x000200f8,0x00000062,
0x0004003d,0x00000006,0x00000091,0x0000005e,0x00050080,0x00000006,0x00000092,0x00000091,
0x00000042,0x0003003e,0x0000005e,0x00000092,0x000200f9,0x0000005f,0x000200f8,0x00000061,
0x000200f9,0x0000005d,0x000200f8,0x0000005d,0x00050041,0x0000000f,0x00000097,0x0000000d,
0x00000015,0x0004003d,0x0000000a,0x00000098,0x00000097,0x00050041,0x00000057,0x0000009a,
0x0000001c,0x00000099,0x0004003d,0x00000006,0x0000009b,0x0000009a,0x0004007c,0x0000000a,
0x0000009c,0x0000009b,0x00050084,0x0000000a,0x0000009d,0x00000098,0x0000009c,0x00050041,
0x0000000f,0x0000009e,0x0000000d,0x0000000e,0x0004003d,0x0000000a,0x0000009f,0x0000009e,
0x00050080,0x0000000a,0x000000a0,0x0000009d,0x0000009f,0x0004003d,0x0000000a,0x000000a1,
0x0000004e,0x00060041,0x000000a2,0x000000a3,0x00000096,0x00000051,0x000000a0,0x0003003e,
0x000000a3,0x000000a1,0x000100fd,0x00010038
};
#if 0 // Generated from:
#version 450 core
#extension GL_EXT_samplerless_texture_functions : require
layout(local_size_x = 8, local_size_y = 8, local_size_z = 1)in;
layout(set = 0, binding = 0)buffer dest
{
uint destData[];
};
layout(push_constant)uniform PushConstants {
ivec2 srcExtent;
ivec2 srcOffset;
int srcLayer;
int destPitch;
ivec2 destExtent;
bool flipX;
bool flipY;
} params;
layout(set = 0, binding = 1)uniform utexture2DMSArray stencil;
void main()
{
ivec2 destSubImageCoords = ivec2(gl_GlobalInvocationID . x * 4, gl_GlobalInvocationID . y);
if(any(lessThanEqual(params . destExtent, destSubImageCoords)))
{
return;
}
ivec2 srcSubImageCoords = destSubImageCoords;
if(params . flipX)
srcSubImageCoords . x = - srcSubImageCoords . x;
if(params . flipY)
srcSubImageCoords . y = - srcSubImageCoords . y;
ivec2 srcImageCoords = params . srcOffset + srcSubImageCoords;
int xDir = params . flipX ? - 1 : 1;
uint outStencils = 0;
if(srcImageCoords . y >= 0 && srcImageCoords . y < params . srcExtent . y)
{
for(int i = 0;i < 4;++ i)
{
uint stencilValue = 0;
if(srcImageCoords . x >= 0 && srcImageCoords . x < params . srcExtent . x)
{
stencilValue = texelFetch(stencil, ivec3(srcImageCoords, params . srcLayer), 0). x;
outStencils |=(stencilValue & 0xFF)<<(i * 8);
}
srcImageCoords . x += xDir;
}
}
destData[gl_GlobalInvocationID . y * params . destPitch + gl_GlobalInvocationID . x]= outStencils;
}
#endif // Preprocessed code
//
// Copyright 2019 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// ResolveStencilNoExport.comp: Resolve multisampled stencil images into a buffer. This is used
// where VK_EXT_shader_stencil_export is not available, to output the resolved stencil into a
// temporary buffer, which is then copied into the stencil aspect of the final image.
#version 450 core
#extension GL_EXT_samplerless_texture_functions : require
#define MAKE_SRC_RESOURCE(prefix, type) prefix ## type
#define STENCIL_SRC_RESOURCE(type) MAKE_SRC_RESOURCE(u, type)
#if SrcIsArray
#define SRC_RESOURCE_NAME texture2DMSArray
#else
#define SRC_RESOURCE_NAME texture2DMS
#endif
layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
layout (set = 0, binding = 0) buffer dest
{
// Note: every invocation handles 4 stencil value and output one value here.
uint destData[];
};
layout(push_constant) uniform PushConstants {
// Robust access.
ivec2 srcExtent;
// Translation from source to destination coordinates.
ivec2 srcOffset;
int srcLayer;
// Output.
int destPitch;
ivec2 destExtent;
// Flip control.
bool flipX;
bool flipY;
} params;
layout(set = 0, binding = 1) uniform STENCIL_SRC_RESOURCE(SRC_RESOURCE_NAME) stencil;
void main()
{
ivec2 destSubImageCoords = ivec2(gl_GlobalInvocationID.x * 4, gl_GlobalInvocationID.y);
if (any(lessThanEqual(params.destExtent, destSubImageCoords)))
{
return;
}
ivec2 srcSubImageCoords = destSubImageCoords;
// If flipping, srcOffset would contain the opposite coordinates, so we can
// simply reverse the direction in which x/y grows.
if (params.flipX)
srcSubImageCoords.x = -srcSubImageCoords.x;
if (params.flipY)
srcSubImageCoords.y = -srcSubImageCoords.y;
ivec2 srcImageCoords = params.srcOffset + srcSubImageCoords;
int xDir = params.flipX ? -1 : 1;
uint outStencils = 0;
// Bounds check on Y:
if (srcImageCoords.y >= 0 && srcImageCoords.y < params.srcExtent.y)
{
for (int i = 0; i < 4; ++i)
{
// Bounds check on X:
uint stencilValue = 0;
if (srcImageCoords.x >= 0 && srcImageCoords.x < params.srcExtent.x)
{
// Note: always resolve using sample 0. GLES3 gives us freedom in choosing how to resolve
// depth/stencil images.
#if SrcIsArray
stencilValue = texelFetch(stencil, ivec3(srcImageCoords, params.srcLayer), 0).x;
#else
stencilValue = texelFetch(stencil, srcImageCoords, 0).x;
#endif
#if IsBigEndian
outStencils |= (stencilValue & 0xFF) << ((3 - i) * 8);
#else
outStencils |= (stencilValue & 0xFF) << (i * 8);
#endif
}
srcImageCoords.x += xDir;
}
}
destData[gl_GlobalInvocationID.y * params.destPitch + gl_GlobalInvocationID.x] = outStencils;
}
{
"Description": [
"Copyright 2019 The ANGLE Project Authors. All rights reserved.",
"Use of this source code is governed by a BSD-style license that can be",
"found in the LICENSE file.",
"",
"ResolveStencilNoExport.frag.comp: Build parameters for ResolveStencilNoExport.comp."
],
"Flags": [
"SrcIsArray"
]
}
...@@ -99,6 +99,8 @@ namespace ...@@ -99,6 +99,8 @@ namespace
#include "libANGLE/renderer/vulkan/shaders/gen/ResolveDepthStencil.frag.00000003.inc" #include "libANGLE/renderer/vulkan/shaders/gen/ResolveDepthStencil.frag.00000003.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ResolveDepthStencil.frag.00000004.inc" #include "libANGLE/renderer/vulkan/shaders/gen/ResolveDepthStencil.frag.00000004.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ResolveDepthStencil.frag.00000005.inc" #include "libANGLE/renderer/vulkan/shaders/gen/ResolveDepthStencil.frag.00000005.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ResolveStencilNoExport.comp.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ResolveStencilNoExport.comp.00000001.inc"
// This is SPIR-V binary blob and the size. // This is SPIR-V binary blob and the size.
struct ShaderBlob struct ShaderBlob
...@@ -208,6 +210,10 @@ constexpr ShaderBlob kResolveDepthStencil_frag_shaders[] = { ...@@ -208,6 +210,10 @@ constexpr ShaderBlob kResolveDepthStencil_frag_shaders[] = {
{kResolveDepthStencil_frag_00000004, sizeof(kResolveDepthStencil_frag_00000004)}, {kResolveDepthStencil_frag_00000004, sizeof(kResolveDepthStencil_frag_00000004)},
{kResolveDepthStencil_frag_00000005, sizeof(kResolveDepthStencil_frag_00000005)}, {kResolveDepthStencil_frag_00000005, sizeof(kResolveDepthStencil_frag_00000005)},
}; };
constexpr ShaderBlob kResolveStencilNoExport_comp_shaders[] = {
{kResolveStencilNoExport_comp_00000000, sizeof(kResolveStencilNoExport_comp_00000000)},
{kResolveStencilNoExport_comp_00000001, sizeof(kResolveStencilNoExport_comp_00000001)},
};
angle::Result GetShader(Context *context, angle::Result GetShader(Context *context,
RefCounted<ShaderAndSerial> *shaders, RefCounted<ShaderAndSerial> *shaders,
...@@ -267,6 +273,10 @@ void ShaderLibrary::destroy(VkDevice device) ...@@ -267,6 +273,10 @@ void ShaderLibrary::destroy(VkDevice device)
{ {
shader.get().destroy(device); shader.get().destroy(device);
} }
for (RefCounted<ShaderAndSerial> &shader : mResolveStencilNoExport_comp_shaders)
{
shader.get().destroy(device);
}
} }
angle::Result ShaderLibrary::getBufferUtils_comp(Context *context, angle::Result ShaderLibrary::getBufferUtils_comp(Context *context,
...@@ -325,5 +335,14 @@ angle::Result ShaderLibrary::getResolveDepthStencil_frag(Context *context, ...@@ -325,5 +335,14 @@ angle::Result ShaderLibrary::getResolveDepthStencil_frag(Context *context,
ArraySize(kResolveDepthStencil_frag_shaders), shaderFlags, shaderOut); ArraySize(kResolveDepthStencil_frag_shaders), shaderFlags, shaderOut);
} }
angle::Result ShaderLibrary::getResolveStencilNoExport_comp(Context *context,
uint32_t shaderFlags,
RefCounted<ShaderAndSerial> **shaderOut)
{
return GetShader(context, mResolveStencilNoExport_comp_shaders,
kResolveStencilNoExport_comp_shaders,
ArraySize(kResolveStencilNoExport_comp_shaders), shaderFlags, shaderOut);
}
} // namespace vk } // namespace vk
} // namespace rx } // namespace rx
...@@ -92,4 +92,6 @@ angle_vulkan_internal_shaders = [ ...@@ -92,4 +92,6 @@ angle_vulkan_internal_shaders = [
"shaders/gen/ResolveDepthStencil.frag.00000003.inc", "shaders/gen/ResolveDepthStencil.frag.00000003.inc",
"shaders/gen/ResolveDepthStencil.frag.00000004.inc", "shaders/gen/ResolveDepthStencil.frag.00000004.inc",
"shaders/gen/ResolveDepthStencil.frag.00000005.inc", "shaders/gen/ResolveDepthStencil.frag.00000005.inc",
"shaders/gen/ResolveStencilNoExport.comp.00000000.inc",
"shaders/gen/ResolveStencilNoExport.comp.00000001.inc",
] ]
...@@ -143,6 +143,15 @@ enum Resolve ...@@ -143,6 +143,15 @@ enum Resolve
}; };
} // namespace ResolveDepthStencil_frag } // namespace ResolveDepthStencil_frag
namespace ResolveStencilNoExport_comp
{
enum flags
{
kSrcIsArray = 0x00000001,
kFlagsMask = 0x00000001,
};
} // namespace ResolveStencilNoExport_comp
} // namespace InternalShader } // namespace InternalShader
class ShaderLibrary final : angle::NonCopyable class ShaderLibrary final : angle::NonCopyable
...@@ -174,6 +183,9 @@ class ShaderLibrary final : angle::NonCopyable ...@@ -174,6 +183,9 @@ class ShaderLibrary final : angle::NonCopyable
angle::Result getResolveDepthStencil_frag(Context *context, angle::Result getResolveDepthStencil_frag(Context *context,
uint32_t shaderFlags, uint32_t shaderFlags,
RefCounted<ShaderAndSerial> **shaderOut); RefCounted<ShaderAndSerial> **shaderOut);
angle::Result getResolveStencilNoExport_comp(Context *context,
uint32_t shaderFlags,
RefCounted<ShaderAndSerial> **shaderOut);
private: private:
RefCounted<ShaderAndSerial> RefCounted<ShaderAndSerial>
...@@ -197,6 +209,8 @@ class ShaderLibrary final : angle::NonCopyable ...@@ -197,6 +209,8 @@ class ShaderLibrary final : angle::NonCopyable
RefCounted<ShaderAndSerial> RefCounted<ShaderAndSerial>
mResolveDepthStencil_frag_shaders[InternalShader::ResolveDepthStencil_frag::kFlagsMask | mResolveDepthStencil_frag_shaders[InternalShader::ResolveDepthStencil_frag::kFlagsMask |
InternalShader::ResolveDepthStencil_frag::kResolveMask]; InternalShader::ResolveDepthStencil_frag::kResolveMask];
RefCounted<ShaderAndSerial> mResolveStencilNoExport_comp_shaders
[InternalShader::ResolveStencilNoExport_comp::kFlagsMask];
}; };
} // namespace vk } // namespace vk
} // namespace rx } // namespace rx
......
...@@ -545,15 +545,6 @@ ...@@ -545,15 +545,6 @@
3189 VULKAN : dEQP-GLES3.functional.shaders.texture_functions.* = SKIP 3189 VULKAN : dEQP-GLES3.functional.shaders.texture_functions.* = SKIP
// Multisampling: // Multisampling:
3200 VULKAN : dEQP-GLES3.functional.fbo.msaa.2_samples.depth32f_stencil8 = FAIL
3200 VULKAN : dEQP-GLES3.functional.fbo.msaa.2_samples.depth24_stencil8 = FAIL
3200 VULKAN : dEQP-GLES3.functional.fbo.msaa.2_samples.stencil_index8 = FAIL
3200 VULKAN : dEQP-GLES3.functional.fbo.msaa.4_samples.depth32f_stencil8 = FAIL
3200 VULKAN : dEQP-GLES3.functional.fbo.msaa.4_samples.depth24_stencil8 = FAIL
3200 VULKAN : dEQP-GLES3.functional.fbo.msaa.4_samples.stencil_index8 = FAIL
3200 VULKAN : dEQP-GLES3.functional.fbo.msaa.8_samples.depth32f_stencil8 = FAIL
3200 VULKAN : dEQP-GLES3.functional.fbo.msaa.8_samples.depth24_stencil8 = FAIL
3200 VULKAN : dEQP-GLES3.functional.fbo.msaa.8_samples.stencil_index8 = FAIL
3204 VULKAN : dEQP-GLES3.functional.multisample.default_framebuffer.sample_coverage_invert = FAIL 3204 VULKAN : dEQP-GLES3.functional.multisample.default_framebuffer.sample_coverage_invert = FAIL
3204 VULKAN : dEQP-GLES3.functional.multisample.default_framebuffer.proportionality_sample_coverage = FAIL 3204 VULKAN : dEQP-GLES3.functional.multisample.default_framebuffer.proportionality_sample_coverage = FAIL
3204 VULKAN : dEQP-GLES3.functional.multisample.default_framebuffer.proportionality_sample_coverage_inverted = FAIL 3204 VULKAN : dEQP-GLES3.functional.multisample.default_framebuffer.proportionality_sample_coverage_inverted = FAIL
......
...@@ -1287,10 +1287,6 @@ TEST_P(BlitFramebufferTest, MultisampleStencil) ...@@ -1287,10 +1287,6 @@ TEST_P(BlitFramebufferTest, MultisampleStencil)
// Incorrect rendering results seen on AMD Windows OpenGL. http://anglebug.com/2486 // Incorrect rendering results seen on AMD Windows OpenGL. http://anglebug.com/2486
ANGLE_SKIP_TEST_IF(IsAMD() && IsOpenGL() && IsWindows()); ANGLE_SKIP_TEST_IF(IsAMD() && IsOpenGL() && IsWindows());
// TODO(syoussefi): Multisampled stencil resolve requires workaround where
// VK_EXT_shader_stencil_export is not supported. http://anglebug.com/3200
ANGLE_SKIP_TEST_IF(IsVulkan() && !IsAMD());
GLRenderbuffer renderbuf; GLRenderbuffer renderbuf;
glBindRenderbuffer(GL_RENDERBUFFER, renderbuf.get()); glBindRenderbuffer(GL_RENDERBUFFER, renderbuf.get());
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_STENCIL_INDEX8, 256, 256); glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_STENCIL_INDEX8, 256, 256);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment