Commit f2a1c384 by Shahbaz Youssefi Committed by Commit Bot

Vulkan: Implement multisampled framebuffers

Simultaneously implements ANGLE_framebuffer_multisample and ES3 multisampled framebuffers. Additionally, implements ES3 framebuffer blitting where multisampled framebuffers are involved. Bug: angleproject:3203 Bug: angleproject:3204 Bug: angleproject:3200 Change-Id: I5694a30f71168e807688a9568e3742b81d907918 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1622667 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: 's avatarYuly Novikov <ynovikov@chromium.org>
parent e0956a16
...@@ -111,6 +111,13 @@ struct FeaturesVk : FeatureSetBase ...@@ -111,6 +111,13 @@ struct FeaturesVk : FeatureSetBase
"supports_external_semaphore_fd", FeatureCategory::VulkanFeatures, "supports_external_semaphore_fd", FeatureCategory::VulkanFeatures,
"VkDevice supports the VK_KHR_external_semaphore_fd extension", &members}; "VkDevice supports the VK_KHR_external_semaphore_fd extension", &members};
// Whether the VkDevice supports the VK_EXT_shader_stencil_export extension, which is used to
// perform multisampled resolve of stencil buffer. A multi-step workaround is used instead if
// this extension is not available.
Feature supportsShaderStencilExport = {
"supports_shader_stencil_export", FeatureCategory::VulkanFeatures,
"VkDevice supports the VK_EXT_shader_stencil_export extension", &members};
// VK_PRESENT_MODE_FIFO_KHR causes random timeouts on Linux Intel. http://anglebug.com/3153 // VK_PRESENT_MODE_FIFO_KHR causes random timeouts on Linux Intel. http://anglebug.com/3153
Feature disableFifoPresentMode = { Feature disableFifoPresentMode = {
"disable_fifo_present_mode", FeatureCategory::VulkanWorkarounds, "disable_fifo_present_mode", FeatureCategory::VulkanWorkarounds,
...@@ -155,7 +162,7 @@ struct FeaturesVk : FeatureSetBase ...@@ -155,7 +162,7 @@ struct FeaturesVk : FeatureSetBase
&members, "http://anglebug.com/3452"}; &members, "http://anglebug.com/3452"};
}; };
inline FeaturesVk::FeaturesVk() = default; inline FeaturesVk::FeaturesVk() = default;
inline FeaturesVk::~FeaturesVk() = default; inline FeaturesVk::~FeaturesVk() = default;
} // namespace angle } // namespace angle
......
...@@ -192,7 +192,7 @@ ...@@ -192,7 +192,7 @@
"Vulkan format:src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp": "Vulkan format:src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp":
"ba26e079062affec8cd72d48f5c91d21", "ba26e079062affec8cd72d48f5c91d21",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/gen_vk_internal_shaders.py": "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/gen_vk_internal_shaders.py":
"4cc82aa02df5371fc2e3d7448a241fc1", "3089dcc7ffff60a8803595fd44278f6e",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000000.inc": "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000000.inc":
"df5fdc47f0950e3eae3d9491e9c84af7", "df5fdc47f0950e3eae3d9491e9c84af7",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000001.inc": "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/BufferUtils.comp.00000001.inc":
...@@ -335,6 +335,30 @@ ...@@ -335,6 +335,30 @@
"084c1b02964cf2baefcc733b7f4e4786", "084c1b02964cf2baefcc733b7f4e4786",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000015.inc": "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000015.inc":
"6a2e5e10e686370f3350a96cda2441a0", "6a2e5e10e686370f3350a96cda2441a0",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ResolveColor.frag.00000000.inc":
"4383093a2f16549fad7b693435284178",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ResolveColor.frag.00000001.inc":
"21f96b0c3175d5b7e6d01635414ec376",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ResolveColor.frag.00000002.inc":
"b6bfc26249df1ddd0beeed009037e101",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ResolveColor.frag.00000003.inc":
"8f5aebf34010a7df080365a80efa5e04",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ResolveColor.frag.00000004.inc":
"569364903ade942f5ebc482d4e3d917e",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ResolveColor.frag.00000005.inc":
"a5d0c416d47045f2a27d878335eb719f",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ResolveDepthStencil.frag.00000000.inc":
"de4c4c10ecb82ff8f55574f15a8b3e4b",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ResolveDepthStencil.frag.00000001.inc":
"3ff50121e47e0f1ce1dfe302d573fb86",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ResolveDepthStencil.frag.00000002.inc":
"be186017048b0ab4a494f3a82cad4b5f",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ResolveDepthStencil.frag.00000003.inc":
"eae087130f7a5d4437984f24698a2f6f",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ResolveDepthStencil.frag.00000004.inc":
"69e0611ce405ee7525af2a59fe3dce02",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/gen/ResolveDepthStencil.frag.00000005.inc":
"ba039e31d7c2259337f80ed6038aafd5",
"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":
...@@ -345,10 +369,14 @@ ...@@ -345,10 +369,14 @@
"7f562c60e5df018b0087ecb8642ac821", "7f562c60e5df018b0087ecb8642ac821",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/ImageCopy.frag": "Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/ImageCopy.frag":
"20c83ade1efb48a802dc34ca838a2be6", "20c83ade1efb48a802dc34ca838a2be6",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/ResolveColor.frag":
"8279b03e2a8b9a495167bf7fe2567716",
"Vulkan internal shader programs:src/libANGLE/renderer/vulkan/shaders/src/ResolveDepthStencil.frag":
"59a1e12ffdb34a4aacf92f96a4fe9c5a",
"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":
"751f3554fe613d9b4739c7a4ac87b037", "50608a69c5126b000ab57d3ea4f1ee18",
"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":
"930fc6f4a705a0d2121770377d3bc764", "719c05d2beed281df2227626a44de35f",
"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":
......
...@@ -1556,7 +1556,7 @@ int Framebuffer::getSamples(const Context *context) ...@@ -1556,7 +1556,7 @@ int Framebuffer::getSamples(const Context *context)
return (isComplete(context) ? getCachedSamples(context) : 0); return (isComplete(context) ? getCachedSamples(context) : 0);
} }
int Framebuffer::getCachedSamples(const Context *context) int Framebuffer::getCachedSamples(const Context *context) const
{ {
ASSERT(mCachedStatus.valid() && mCachedStatus.value() == GL_FRAMEBUFFER_COMPLETE); ASSERT(mCachedStatus.valid() && mCachedStatus.value() == GL_FRAMEBUFFER_COMPLETE);
......
...@@ -254,7 +254,7 @@ class Framebuffer final : public angle::ObserverInterface, ...@@ -254,7 +254,7 @@ class Framebuffer final : public angle::ObserverInterface,
} }
// For when we don't want to check completeness in getSamples(). // For when we don't want to check completeness in getSamples().
int getCachedSamples(const Context *context); int getCachedSamples(const Context *context) const;
// Helper for checkStatus == GL_FRAMEBUFFER_COMPLETE. // Helper for checkStatus == GL_FRAMEBUFFER_COMPLETE.
ANGLE_INLINE bool isComplete(const Context *context) ANGLE_INLINE bool isComplete(const Context *context)
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include "libANGLE/renderer/RenderTargetCache.h" #include "libANGLE/renderer/RenderTargetCache.h"
#include "libANGLE/renderer/vulkan/BufferVk.h" #include "libANGLE/renderer/vulkan/BufferVk.h"
#include "libANGLE/renderer/vulkan/CommandGraph.h" #include "libANGLE/renderer/vulkan/CommandGraph.h"
#include "libANGLE/renderer/vulkan/UtilsVk.h"
#include "libANGLE/renderer/vulkan/vk_cache_utils.h" #include "libANGLE/renderer/vulkan/vk_cache_utils.h"
namespace rx namespace rx
...@@ -188,6 +189,20 @@ class FramebufferVk : public FramebufferImpl ...@@ -188,6 +189,20 @@ class FramebufferVk : public FramebufferImpl
void updateRenderPassDesc(); void updateRenderPassDesc();
angle::Result updateColorAttachment(const gl::Context *context, size_t colorIndex); angle::Result updateColorAttachment(const gl::Context *context, size_t colorIndex);
private:
// Resolve from the read framebuffer into the draw framebuffer. This is a specialized usage of
// glBlitFramebuffer() for multisampled images where scaling is not performed.
angle::Result resolve(ContextVk *contextVk,
const gl::Rectangle &area,
bool resolveColorBuffer,
bool resolveDepthBuffer,
bool resolveStencilBuffer);
// Resolve color with vkCmdResolveImage
angle::Result resolveColorWithCommand(ContextVk *contextVk,
const UtilsVk::ResolveParameters &params,
vk::ImageHelper *srcImage);
WindowSurfaceVk *mBackbuffer; WindowSurfaceVk *mBackbuffer;
vk::RenderPassDesc mRenderPassDesc; vk::RenderPassDesc mRenderPassDesc;
......
...@@ -21,6 +21,7 @@ ANGLE_DISABLE_EXTRA_SEMI_WARNING ...@@ -21,6 +21,7 @@ ANGLE_DISABLE_EXTRA_SEMI_WARNING
ANGLE_REENABLE_EXTRA_SEMI_WARNING ANGLE_REENABLE_EXTRA_SEMI_WARNING
#include <array> #include <array>
#include <numeric>
#include "common/FixedVector.h" #include "common/FixedVector.h"
#include "common/string_utils.h" #include "common/string_utils.h"
...@@ -293,6 +294,20 @@ std::string GetMappedSamplerName(const std::string &originalName) ...@@ -293,6 +294,20 @@ std::string GetMappedSamplerName(const std::string &originalName)
samplerName.erase(std::remove(samplerName.begin(), samplerName.end(), ']'), samplerName.end()); samplerName.erase(std::remove(samplerName.begin(), samplerName.end(), ']'), samplerName.end());
return samplerName; return samplerName;
} }
template <typename OutputIter, typename ImplicitIter>
uint32_t CountExplicitOutputs(OutputIter outputsBegin,
OutputIter outputsEnd,
ImplicitIter implicitsBegin,
ImplicitIter implicitsEnd)
{
auto reduce = [implicitsBegin, implicitsEnd](uint32_t count, const sh::OutputVariable &var) {
bool isExplicit = std::find(implicitsBegin, implicitsEnd, var.name) == implicitsEnd;
return count + isExplicit;
};
return std::accumulate(outputsBegin, outputsEnd, 0, reduce);
}
} // anonymous namespace } // anonymous namespace
// static // static
...@@ -350,8 +365,10 @@ void GlslangWrapper::GetShaderSource(const gl::ProgramState &programState, ...@@ -350,8 +365,10 @@ void GlslangWrapper::GetShaderSource(const gl::ProgramState &programState,
// Parse output locations and replace them in the fragment shader. // Parse output locations and replace them in the fragment shader.
// See corresponding code in OutputVulkanGLSL.cpp. // See corresponding code in OutputVulkanGLSL.cpp.
// TODO(syoussefi): Add support for EXT_blend_func_extended. http://anglebug.com/3385 // TODO(syoussefi): Add support for EXT_blend_func_extended. http://anglebug.com/3385
const auto &outputLocations = programState.getOutputLocations(); const auto &outputLocations = programState.getOutputLocations();
const auto &outputVariables = programState.getOutputVariables(); const auto &outputVariables = programState.getOutputVariables();
const std::array<std::string, 3> implicitOutputs = {"gl_FragDepth", "gl_SampleMask",
"gl_FragStencilRefARB"};
for (const gl::VariableLocation &outputLocation : outputLocations) for (const gl::VariableLocation &outputLocation : outputLocations)
{ {
if (outputLocation.arrayIndex == 0 && outputLocation.used() && !outputLocation.ignored) if (outputLocation.arrayIndex == 0 && outputLocation.used() && !outputLocation.ignored)
...@@ -363,11 +380,13 @@ void GlslangWrapper::GetShaderSource(const gl::ProgramState &programState, ...@@ -363,11 +380,13 @@ void GlslangWrapper::GetShaderSource(const gl::ProgramState &programState,
{ {
locationString = "location = " + Str(outputVar.location); locationString = "location = " + Str(outputVar.location);
} }
else else if (std::find(implicitOutputs.begin(), implicitOutputs.end(), outputVar.name) ==
implicitOutputs.end())
{ {
// If there is only one output, it is allowed not to have a location qualifier, in // If there is only one output, it is allowed not to have a location qualifier, in
// which case it defaults to 0. GLSL ES 3.00 spec, section 4.3.8.2. // which case it defaults to 0. GLSL ES 3.00 spec, section 4.3.8.2.
ASSERT(outputVariables.size() == 1); ASSERT(CountExplicitOutputs(outputVariables.begin(), outputVariables.end(),
implicitOutputs.begin(), implicitOutputs.end()) == 1);
locationString = "location = 0"; locationString = "location = 0";
} }
...@@ -487,7 +506,7 @@ void GlslangWrapper::GetShaderSource(const gl::ProgramState &programState, ...@@ -487,7 +506,7 @@ void GlslangWrapper::GetShaderSource(const gl::ProgramState &programState,
// Assign textures to a descriptor set and binding. // Assign textures to a descriptor set and binding.
uint32_t textureBinding = 0; uint32_t textureBinding = 0;
const auto &uniforms = programState.getUniforms(); const auto &uniforms = programState.getUniforms();
for (unsigned int uniformIndex : programState.getSamplerUniformRange()) for (unsigned int uniformIndex : programState.getSamplerUniformRange())
{ {
const gl::LinkedUniform &samplerUniform = uniforms[uniformIndex]; const gl::LinkedUniform &samplerUniform = uniforms[uniformIndex];
......
...@@ -41,20 +41,20 @@ void RenderTargetVk::init(vk::ImageHelper *image, ...@@ -41,20 +41,20 @@ void RenderTargetVk::init(vk::ImageHelper *image,
size_t levelIndex, size_t levelIndex,
size_t layerIndex) size_t layerIndex)
{ {
mImage = image; mImage = image;
mImageView = imageView; mImageView = imageView;
mCubeImageFetchView = cubeImageFetchView; mCubeImageFetchView = cubeImageFetchView;
mLevelIndex = levelIndex; mLevelIndex = levelIndex;
mLayerIndex = layerIndex; mLayerIndex = layerIndex;
} }
void RenderTargetVk::reset() void RenderTargetVk::reset()
{ {
mImage = nullptr; mImage = nullptr;
mImageView = nullptr; mImageView = nullptr;
mCubeImageFetchView = nullptr; mCubeImageFetchView = nullptr;
mLevelIndex = 0; mLevelIndex = 0;
mLayerIndex = 0; mLayerIndex = 0;
} }
angle::Result RenderTargetVk::onColorDraw(ContextVk *contextVk, angle::Result RenderTargetVk::onColorDraw(ContextVk *contextVk,
...@@ -137,8 +137,8 @@ gl::Extents RenderTargetVk::getExtents() const ...@@ -137,8 +137,8 @@ gl::Extents RenderTargetVk::getExtents() const
void RenderTargetVk::updateSwapchainImage(vk::ImageHelper *image, vk::ImageView *imageView) void RenderTargetVk::updateSwapchainImage(vk::ImageHelper *image, vk::ImageView *imageView)
{ {
ASSERT(image && image->valid() && imageView && imageView->valid()); ASSERT(image && image->valid() && imageView && imageView->valid());
mImage = image; mImage = image;
mImageView = imageView; mImageView = imageView;
mCubeImageFetchView = nullptr; mCubeImageFetchView = nullptr;
} }
......
...@@ -29,10 +29,11 @@ void RenderbufferVk::onDestroy(const gl::Context *context) ...@@ -29,10 +29,11 @@ void RenderbufferVk::onDestroy(const gl::Context *context)
releaseAndDeleteImage(contextVk); releaseAndDeleteImage(contextVk);
} }
angle::Result RenderbufferVk::setStorage(const gl::Context *context, angle::Result RenderbufferVk::setStorageImpl(const gl::Context *context,
GLenum internalformat, size_t samples,
size_t width, GLenum internalformat,
size_t height) size_t width,
size_t height)
{ {
ContextVk *contextVk = vk::GetImpl(context); ContextVk *contextVk = vk::GetImpl(context);
RendererVk *renderer = contextVk->getRenderer(); RendererVk *renderer = contextVk->getRenderer();
...@@ -71,7 +72,8 @@ angle::Result RenderbufferVk::setStorage(const gl::Context *context, ...@@ -71,7 +72,8 @@ angle::Result RenderbufferVk::setStorage(const gl::Context *context,
(isDepthOrStencilFormat ? VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT : 0); (isDepthOrStencilFormat ? VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT : 0);
gl::Extents extents(static_cast<int>(width), static_cast<int>(height), 1); gl::Extents extents(static_cast<int>(width), static_cast<int>(height), 1);
ANGLE_TRY(mImage->init(contextVk, gl::TextureType::_2D, extents, vkFormat, 1, usage, 1, 1)); ANGLE_TRY(
mImage->init(contextVk, gl::TextureType::_2D, extents, vkFormat, samples, usage, 1, 1));
VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; VkMemoryPropertyFlags flags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT;
ANGLE_TRY(mImage->initMemory(contextVk, renderer->getMemoryProperties(), flags)); ANGLE_TRY(mImage->initMemory(contextVk, renderer->getMemoryProperties(), flags));
...@@ -92,14 +94,51 @@ angle::Result RenderbufferVk::setStorage(const gl::Context *context, ...@@ -92,14 +94,51 @@ angle::Result RenderbufferVk::setStorage(const gl::Context *context,
return angle::Result::Continue; return angle::Result::Continue;
} }
angle::Result RenderbufferVk::setStorage(const gl::Context *context,
GLenum internalformat,
size_t width,
size_t height)
{
return setStorageImpl(context, 1, internalformat, width, height);
}
angle::Result RenderbufferVk::setStorageMultisample(const gl::Context *context, angle::Result RenderbufferVk::setStorageMultisample(const gl::Context *context,
size_t samples, size_t samples,
GLenum internalformat, GLenum internalformat,
size_t width, size_t width,
size_t height) size_t height)
{ {
ANGLE_VK_UNREACHABLE(vk::GetImpl(context)); // If the specific number of samples requested is not supported, the smallest number that's at
return angle::Result::Stop; // least that many needs to be selected.
const RendererVk *renderer = vk::GetImpl(context)->getRenderer();
const angle::Format &format = renderer->getFormat(internalformat).imageFormat();
const VkPhysicalDeviceLimits &limits = renderer->getPhysicalDeviceProperties().limits;
const uint32_t colorSampleCounts = limits.framebufferColorSampleCounts;
const uint32_t depthSampleCounts = limits.framebufferDepthSampleCounts;
const uint32_t stencilSampleCounts = limits.framebufferStencilSampleCounts;
const uint32_t depthStencilSampleCounts = depthSampleCounts & stencilSampleCounts;
uint32_t formatSampleCounts = colorSampleCounts;
if (format.depthBits > 0)
{
if (format.stencilBits > 0)
{
formatSampleCounts = depthStencilSampleCounts;
}
else
{
formatSampleCounts = depthSampleCounts;
}
}
else if (format.stencilBits > 0)
{
formatSampleCounts = stencilSampleCounts;
}
samples = vk_gl::GetSampleCount(formatSampleCounts, samples);
return setStorageImpl(context, samples, internalformat, width, height);
} }
angle::Result RenderbufferVk::setStorageEGLImageTarget(const gl::Context *context, angle::Result RenderbufferVk::setStorageEGLImageTarget(const gl::Context *context,
...@@ -135,9 +174,8 @@ angle::Result RenderbufferVk::setStorageEGLImageTarget(const gl::Context *contex ...@@ -135,9 +174,8 @@ angle::Result RenderbufferVk::setStorageEGLImageTarget(const gl::Context *contex
if (imageVk->getImageTextureType() == gl::TextureType::CubeMap) if (imageVk->getImageTextureType() == gl::TextureType::CubeMap)
{ {
gl::TextureType arrayType = imageVk->getImage()->getSamples() > 1 gl::TextureType arrayType = vk::Get2DTextureType(imageVk->getImage()->getLayerCount(),
? gl::TextureType::_2DMultisampleArray imageVk->getImage()->getSamples());
: gl::TextureType::_2DArray;
ANGLE_TRY(mImage->initLayerImageView(contextVk, arrayType, aspect, gl::SwizzleState(), ANGLE_TRY(mImage->initLayerImageView(contextVk, arrayType, aspect, gl::SwizzleState(),
&mCubeImageFetchView, imageVk->getImageLevel(), 1, &mCubeImageFetchView, imageVk->getImageLevel(), 1,
imageVk->getImageLayer(), 1)); imageVk->getImageLayer(), 1));
......
...@@ -51,6 +51,12 @@ class RenderbufferVk : public RenderbufferImpl ...@@ -51,6 +51,12 @@ class RenderbufferVk : public RenderbufferImpl
void releaseAndDeleteImage(ContextVk *contextVk); void releaseAndDeleteImage(ContextVk *contextVk);
void releaseImage(ContextVk *contextVk); void releaseImage(ContextVk *contextVk);
angle::Result setStorageImpl(const gl::Context *context,
size_t samples,
GLenum internalformat,
size_t width,
size_t height);
bool mOwnsImage; bool mOwnsImage;
vk::ImageHelper *mImage; vk::ImageHelper *mImage;
vk::ImageView mImageView; vk::ImageView mImageView;
......
...@@ -659,7 +659,7 @@ angle::Result RendererVk::initialize(DisplayVk *displayVk, ...@@ -659,7 +659,7 @@ angle::Result RendererVk::initialize(DisplayVk *displayVk,
ANGLE_VK_TRY(displayVk, ANGLE_VK_TRY(displayVk,
VerifyExtensionsPresent(instanceExtensionNames, enabledInstanceExtensions)); VerifyExtensionsPresent(instanceExtensionNames, enabledInstanceExtensions));
// Enable VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME if available. // Enable VK_KHR_get_physical_device_properties_2 if available.
if (ExtensionFound(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, if (ExtensionFound(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
instanceExtensionNames)) instanceExtensionNames))
{ {
...@@ -936,6 +936,11 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF ...@@ -936,6 +936,11 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF
enabledDeviceExtensions.push_back(VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME); enabledDeviceExtensions.push_back(VK_KHR_EXTERNAL_SEMAPHORE_FD_EXTENSION_NAME);
} }
if (getFeatures().supportsShaderStencilExport.enabled)
{
enabledDeviceExtensions.push_back(VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME);
}
std::sort(enabledDeviceExtensions.begin(), enabledDeviceExtensions.end(), StrLess); std::sort(enabledDeviceExtensions.begin(), enabledDeviceExtensions.end(), StrLess);
ANGLE_VK_TRY(displayVk, VerifyExtensionsPresent(deviceExtensionNames, enabledDeviceExtensions)); ANGLE_VK_TRY(displayVk, VerifyExtensionsPresent(deviceExtensionNames, enabledDeviceExtensions));
...@@ -1191,6 +1196,11 @@ void RendererVk::initFeatures(const ExtensionNameList &deviceExtensionNames) ...@@ -1191,6 +1196,11 @@ void RendererVk::initFeatures(const ExtensionNameList &deviceExtensionNames)
mFeatures.supportsExternalSemaphoreFd.enabled = true; mFeatures.supportsExternalSemaphoreFd.enabled = true;
} }
if (ExtensionFound(VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME, deviceExtensionNames))
{
mFeatures.supportsShaderStencilExport.enabled = true;
}
if (IsLinux() && IsIntel(mPhysicalDeviceProperties.vendorID)) if (IsLinux() && IsIntel(mPhysicalDeviceProperties.vendorID))
{ {
mFeatures.disableFifoPresentMode.enabled = true; mFeatures.disableFifoPresentMode.enabled = true;
......
...@@ -65,32 +65,6 @@ bool ForceCpuPathForCopy(RendererVk *renderer, vk::ImageHelper *image) ...@@ -65,32 +65,6 @@ bool ForceCpuPathForCopy(RendererVk *renderer, vk::ImageHelper *image)
{ {
return image->getLayerCount() > 1 && renderer->getFeatures().forceCpuPathForCubeMapCopy.enabled; return image->getLayerCount() > 1 && renderer->getFeatures().forceCpuPathForCubeMapCopy.enabled;
} }
gl::TextureType Get2DTextureType(uint32_t layerCount, GLint samples)
{
if (layerCount > 1)
{
if (samples > 1)
{
return gl::TextureType::_2DMultisampleArray;
}
else
{
return gl::TextureType::_2DArray;
}
}
else
{
if (samples > 1)
{
return gl::TextureType::_2DMultisample;
}
else
{
return gl::TextureType::_2D;
}
}
}
} // anonymous namespace } // anonymous namespace
angle::Result TextureVk::generateMipmapLevelsWithCPU(ContextVk *contextVk, angle::Result TextureVk::generateMipmapLevelsWithCPU(ContextVk *contextVk,
...@@ -676,7 +650,7 @@ angle::Result TextureVk::copySubImageImplWithDraw(ContextVk *contextVk, ...@@ -676,7 +650,7 @@ angle::Result TextureVk::copySubImageImplWithDraw(ContextVk *contextVk,
std::unique_ptr<vk::ImageHelper> stagingImage; std::unique_ptr<vk::ImageHelper> stagingImage;
GLint samples = srcImage->getSamples(); GLint samples = srcImage->getSamples();
gl::TextureType stagingTextureType = Get2DTextureType(layerCount, samples); gl::TextureType stagingTextureType = vk::Get2DTextureType(layerCount, samples);
// Create a temporary image to stage the copy // Create a temporary image to stage the copy
stagingImage = std::make_unique<vk::ImageHelper>(); stagingImage = std::make_unique<vk::ImageHelper>();
...@@ -1182,7 +1156,7 @@ angle::Result TextureVk::initCubeMapRenderTargets(ContextVk *contextVk) ...@@ -1182,7 +1156,7 @@ angle::Result TextureVk::initCubeMapRenderTargets(ContextVk *contextVk)
// need create a fetch view for each layer as well. // need create a fetch view for each layer as well.
gl::SwizzleState mappedSwizzle; gl::SwizzleState mappedSwizzle;
MapSwizzleState(mImage->getFormat(), mState.getSwizzleState(), &mappedSwizzle); MapSwizzleState(mImage->getFormat(), mState.getSwizzleState(), &mappedSwizzle);
gl::TextureType arrayType = Get2DTextureType(gl::kCubeFaceCount, mImage->getSamples()); gl::TextureType arrayType = vk::Get2DTextureType(gl::kCubeFaceCount, mImage->getSamples());
ANGLE_TRY(mImage->initLayerImageView(contextVk, arrayType, mImage->getAspectFlags(), ANGLE_TRY(mImage->initLayerImageView(contextVk, arrayType, mImage->getAspectFlags(),
mappedSwizzle, &mLayerFetchImageView[cubeMapFaceIndex], mappedSwizzle, &mLayerFetchImageView[cubeMapFaceIndex],
getNativeImageLevel(0), 1, getNativeImageLevel(0), 1,
...@@ -1421,7 +1395,7 @@ angle::Result TextureVk::initImageViews(ContextVk *contextVk, ...@@ -1421,7 +1395,7 @@ angle::Result TextureVk::initImageViews(ContextVk *contextVk,
layerCount)); layerCount));
if (mState.getType() == gl::TextureType::CubeMap) if (mState.getType() == gl::TextureType::CubeMap)
{ {
gl::TextureType arrayType = Get2DTextureType(layerCount, mImage->getSamples()); gl::TextureType arrayType = vk::Get2DTextureType(layerCount, mImage->getSamples());
ANGLE_TRY(mImage->initLayerImageView(contextVk, arrayType, aspectFlags, mappedSwizzle, ANGLE_TRY(mImage->initLayerImageView(contextVk, arrayType, aspectFlags, mappedSwizzle,
&mFetchMipmapImageView, baseLevel, levelCount, &mFetchMipmapImageView, baseLevel, levelCount,
......
...@@ -14,7 +14,11 @@ ...@@ -14,7 +14,11 @@
// * Used by VertexArrayVk::convertVertexBuffer() to convert vertex attributes from unsupported // * Used by VertexArrayVk::convertVertexBuffer() to convert vertex attributes from unsupported
// formats to their fallbacks. // formats to their fallbacks.
// - Image clear: Used by FramebufferVk::clearWithDraw(). // - Image clear: Used by FramebufferVk::clearWithDraw().
// - Image copy: Not yet implemented // - Image copy: Used by TextureVk::copySubImageImplWithDraw().
// - Color resolve: Used by FramebufferVk::resolve() to implement multisample resolve on color
// images.
// - Depth/Stencil resolve: Used by FramebufferVk::resolve() to implement multisample resolve on
// depth/stencil images.
// - Mipmap generation: Not yet implemented // - Mipmap generation: Not yet implemented
// //
...@@ -65,8 +69,6 @@ class UtilsVk : angle::NonCopyable ...@@ -65,8 +69,6 @@ class UtilsVk : angle::NonCopyable
// safer way. // safer way.
ClearFramebufferParameters(); ClearFramebufferParameters();
const vk::RenderPassDesc *renderPassDesc;
GLint renderAreaHeight;
gl::Rectangle clearArea; gl::Rectangle clearArea;
// Note that depth clear is never needed to be done with a draw call. // Note that depth clear is never needed to be done with a draw call.
...@@ -82,6 +84,20 @@ class UtilsVk : angle::NonCopyable ...@@ -82,6 +84,20 @@ class UtilsVk : angle::NonCopyable
uint8_t stencilClearValue; uint8_t stencilClearValue;
}; };
struct ResolveParameters
{
// |srcOffset| and |dstOffset| define the transformation from source to destination.
int srcOffset[2];
int destOffset[2];
// |srcExtents| is used to avoid fetching outside the source image.
int srcExtents[2];
// |resolveArea| defines the actual scissored region that will participate in resolve.
gl::Rectangle resolveArea;
int srcLayer;
bool flipX;
bool flipY;
};
struct CopyImageParameters struct CopyImageParameters
{ {
int srcOffset[2]; int srcOffset[2];
...@@ -111,6 +127,17 @@ class UtilsVk : angle::NonCopyable ...@@ -111,6 +127,17 @@ class UtilsVk : angle::NonCopyable
angle::Result clearFramebuffer(ContextVk *contextVk, angle::Result clearFramebuffer(ContextVk *contextVk,
FramebufferVk *framebuffer, FramebufferVk *framebuffer,
const ClearFramebufferParameters &params); const ClearFramebufferParameters &params);
angle::Result colorResolve(ContextVk *contextVk,
FramebufferVk *framebuffer,
vk::ImageHelper *src,
const vk::ImageView *srcView,
const ResolveParameters &params);
angle::Result depthStencilResolve(ContextVk *contextVk,
FramebufferVk *framebuffer,
vk::ImageHelper *src,
const vk::ImageView *srcDepthView,
const vk::ImageView *srcStencilView,
const ResolveParameters &params);
angle::Result copyImage(ContextVk *contextVk, angle::Result copyImage(ContextVk *contextVk,
vk::ImageHelper *dest, vk::ImageHelper *dest,
...@@ -172,21 +199,48 @@ class UtilsVk : angle::NonCopyable ...@@ -172,21 +199,48 @@ class UtilsVk : angle::NonCopyable
uint32_t destDefaultChannelsMask = 0; uint32_t destDefaultChannelsMask = 0;
}; };
struct ResolveColorShaderParams
{
// Structure matching PushConstants in ResolveColor.frag
int32_t srcExtent[2] = {};
int32_t srcOffset[2] = {};
int32_t destOffset[2] = {};
int32_t srcLayer = 0;
int32_t samples = 0;
float invSamples = 0;
uint32_t outputMask = 0;
uint32_t flipX = 0;
uint32_t flipY = 0;
};
struct ResolveDepthStencilShaderParams
{
// Structure matching PushConstants in ResolvedDepthStencil.frag
int32_t srcExtent[2] = {};
int32_t srcOffset[2] = {};
int32_t destOffset[2] = {};
int32_t srcLayer = 0;
uint32_t flipX = 0;
uint32_t flipY = 0;
};
// Functions implemented by the class: // Functions implemented by the class:
enum class Function enum class Function
{ {
// Functions implemented in graphics // Functions implemented in graphics
ImageClear = 0, ImageClear = 0,
ImageCopy = 1, ImageCopy = 1,
ResolveColor = 2,
ResolveDepthStencil = 3,
// Functions implemented in compute // Functions implemented in compute
ComputeStartIndex = 2, // Special value to separate draw and dispatch functions. ComputeStartIndex = 4, // Special value to separate draw and dispatch functions.
BufferClear = 2, BufferClear = 4,
BufferCopy = 3, BufferCopy = 5,
ConvertVertexBuffer = 4, ConvertVertexBuffer = 6,
InvalidEnum = 5, InvalidEnum = 7,
EnumCount = 5, EnumCount = 7,
}; };
// 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
...@@ -223,6 +277,8 @@ class UtilsVk : angle::NonCopyable ...@@ -223,6 +277,8 @@ class UtilsVk : angle::NonCopyable
angle::Result ensureConvertVertexResourcesInitialized(ContextVk *context); angle::Result ensureConvertVertexResourcesInitialized(ContextVk *context);
angle::Result ensureImageClearResourcesInitialized(ContextVk *context); angle::Result ensureImageClearResourcesInitialized(ContextVk *context);
angle::Result ensureImageCopyResourcesInitialized(ContextVk *context); angle::Result ensureImageCopyResourcesInitialized(ContextVk *context);
angle::Result ensureResolveColorResourcesInitialized(ContextVk *context);
angle::Result ensureResolveDepthStencilResourcesInitialized(ContextVk *context);
angle::Result startRenderPass(ContextVk *contextVk, angle::Result startRenderPass(ContextVk *contextVk,
vk::ImageHelper *image, vk::ImageHelper *image,
...@@ -249,6 +305,12 @@ class UtilsVk : angle::NonCopyable ...@@ -249,6 +305,12 @@ class UtilsVk : angle::NonCopyable
vk::ShaderProgramHelper mImageCopyPrograms[vk::InternalShader::ImageCopy_frag::kFlagsMask | vk::ShaderProgramHelper mImageCopyPrograms[vk::InternalShader::ImageCopy_frag::kFlagsMask |
vk::InternalShader::ImageCopy_frag::kSrcFormatMask | vk::InternalShader::ImageCopy_frag::kSrcFormatMask |
vk::InternalShader::ImageCopy_frag::kDestFormatMask]; vk::InternalShader::ImageCopy_frag::kDestFormatMask];
vk::ShaderProgramHelper
mResolveColorPrograms[vk::InternalShader::ResolveColor_frag::kFlagsMask |
vk::InternalShader::ResolveColor_frag::kFormatMask];
vk::ShaderProgramHelper
mResolveDepthStencilPrograms[vk::InternalShader::ResolveDepthStencil_frag::kFlagsMask |
vk::InternalShader::ResolveDepthStencil_frag::kResolveMask];
}; };
} // namespace rx } // namespace rx
......
...@@ -636,9 +636,9 @@ def main(): ...@@ -636,9 +636,9 @@ def main():
# a number where each bit says whether a flag is active or not, # a number where each bit says whether a flag is active or not,
# with values in [0, 2^len(flags)) # with values in [0, 2^len(flags))
for flags_active in range(1 << len(flags)): for flags_active in range(1 << len(flags)):
compile_variation(glslang_path, compile_queue, shader_file, output_name, flags, compile_variation(glslang_path if do_compile else None, compile_queue, shader_file,
enums, flags_active, enum_indices, flags_bits, enum_bits, output_name, flags, enums, flags_active, enum_indices,
output_shaders) flags_bits, enum_bits, output_shaders)
if not next_enum_variation(enums, enum_indices): if not next_enum_variation(enums, enum_indices):
break break
......
// 7.12.3226
#pragma once
const uint32_t kResolveDepthStencil_frag_00000000[] = {
0x07230203,0x00010000,0x00080007,0x0000005d,0x00000000,0x00020011,0x00000001,0x0006000b,
0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x0000000d,0x0000005b,0x00030010,
0x00000004,0x00000007,0x00030010,0x00000004,0x0000000c,0x00030003,0x00000002,0x000001c2,
0x00090004,0x415f4c47,0x735f4252,0x65646168,0x74735f72,0x69636e65,0x78655f6c,0x74726f70,
0x00000000,0x000b0004,0x455f4c47,0x735f5458,0x6c706d61,0x656c7265,0x745f7373,0x75747865,
0x665f6572,0x74636e75,0x736e6f69,0x00000000,0x00040005,0x00000004,0x6e69616d,0x00000000,
0x00070005,0x00000009,0x74736564,0x49627553,0x6567616d,0x726f6f43,0x00007364,0x00060005,
0x0000000d,0x465f6c67,0x43676172,0x64726f6f,0x00000000,0x00060005,0x00000013,0x68737550,
0x736e6f43,0x746e6174,0x00000073,0x00060006,0x00000013,0x00000000,0x45637273,0x6e657478,
0x00000074,0x00060006,0x00000013,0x00000001,0x4f637273,0x65736666,0x00000074,0x00060006,
0x00000013,0x00000002,0x74736564,0x7366664f,0x00007465,0x00060006,0x00000013,0x00000003,
0x4c637273,0x72657961,0x00000000,0x00050006,0x00000013,0x00000004,0x70696c66,0x00000058,
0x00050006,0x00000013,0x00000005,0x70696c66,0x00000059,0x00040005,0x00000015,0x61726170,
0x0000736d,0x00070005,0x0000001b,0x53637273,0x6d496275,0x43656761,0x64726f6f,0x00000073,
0x00060005,0x00000036,0x49637273,0x6567616d,0x726f6f43,0x00007364,0x00050005,0x0000004e,
0x74706564,0x6c615668,0x00006575,0x00060005,0x00000051,0x6e657473,0x566c6963,0x65756c61,
0x00000000,0x00040005,0x00000055,0x74706564,0x00000068,0x00060005,0x0000005b,0x465f6c67,
0x44676172,0x68747065,0x00000000,0x00040047,0x0000000d,0x0000000b,0x0000000f,0x00050048,
0x00000013,0x00000000,0x00000023,0x00000000,0x00050048,0x00000013,0x00000001,0x00000023,
0x00000008,0x00050048,0x00000013,0x00000002,0x00000023,0x00000010,0x00050048,0x00000013,
0x00000003,0x00000023,0x00000018,0x00050048,0x00000013,0x00000004,0x00000023,0x0000001c,
0x00050048,0x00000013,0x00000005,0x00000023,0x00000020,0x00030047,0x00000013,0x00000002,
0x00040047,0x00000055,0x00000022,0x00000000,0x00040047,0x00000055,0x00000021,0x00000000,
0x00040047,0x0000005b,0x0000000b,0x00000016,0x00020013,0x00000002,0x00030021,0x00000003,
0x00000002,0x00040015,0x00000006,0x00000020,0x00000001,0x00040017,0x00000007,0x00000006,
0x00000002,0x00040020,0x00000008,0x00000007,0x00000007,0x00030016,0x0000000a,0x00000020,
0x00040017,0x0000000b,0x0000000a,0x00000004,0x00040020,0x0000000c,0x00000001,0x0000000b,
0x0004003b,0x0000000c,0x0000000d,0x00000001,0x00040017,0x0000000e,0x0000000a,0x00000002,
0x00040015,0x00000012,0x00000020,0x00000000,0x0008001e,0x00000013,0x00000007,0x00000007,
0x00000007,0x00000006,0x00000012,0x00000012,0x00040020,0x00000014,0x00000009,0x00000013,
0x0004003b,0x00000014,0x00000015,0x00000009,0x0004002b,0x00000006,0x00000016,0x00000002,
0x00040020,0x00000017,0x00000009,0x00000007,0x0004002b,0x00000006,0x0000001d,0x00000004,
0x00040020,0x0000001e,0x00000009,0x00000012,0x00020014,0x00000021,0x0004002b,0x00000012,
0x00000022,0x00000000,0x00040020,0x00000026,0x00000007,0x00000006,0x0004002b,0x00000006,
0x0000002b,0x00000005,0x0004002b,0x00000012,0x00000031,0x00000001,0x0004002b,0x00000006,
0x00000037,0x00000001,0x0004002b,0x00000006,0x0000003d,0x00000000,0x0005002c,0x00000007,
0x0000003e,0x0000003d,0x0000003d,0x00040017,0x0000003f,0x00000021,0x00000002,0x00040020,
0x0000004d,0x00000007,0x0000000a,0x0004002b,0x0000000a,0x0000004f,0x00000000,0x00040020,
0x00000050,0x00000007,0x00000012,0x00090019,0x00000053,0x0000000a,0x00000001,0x00000000,
0x00000000,0x00000001,0x00000001,0x00000000,0x00040020,0x00000054,0x00000000,0x00000053,
0x0004003b,0x00000054,0x00000055,0x00000000,0x00040020,0x0000005a,0x00000003,0x0000000a,
0x0004003b,0x0000005a,0x0000005b,0x00000003,0x00050036,0x00000002,0x00000004,0x00000000,
0x00000003,0x000200f8,0x00000005,0x0004003b,0x00000008,0x00000009,0x00000007,0x0004003b,
0x00000008,0x0000001b,0x00000007,0x0004003b,0x00000008,0x00000036,0x00000007,0x0004003b,
0x0000004d,0x0000004e,0x00000007,0x0004003b,0x00000050,0x00000051,0x00000007,0x0004003d,
0x0000000b,0x0000000f,0x0000000d,0x0007004f,0x0000000e,0x00000010,0x0000000f,0x0000000f,
0x00000000,0x00000001,0x0004006e,0x00000007,0x00000011,0x00000010,0x00050041,0x00000017,
0x00000018,0x00000015,0x00000016,0x0004003d,0x00000007,0x00000019,0x00000018,0x00050082,
0x00000007,0x0000001a,0x00000011,0x00000019,0x0003003e,0x00000009,0x0000001a,0x0004003d,
0x00000007,0x0000001c,0x00000009,0x0003003e,0x0000001b,0x0000001c,0x00050041,0x0000001e,
0x0000001f,0x00000015,0x0000001d,0x0004003d,0x00000012,0x00000020,0x0000001f,0x000500ab,
0x00000021,0x00000023,0x00000020,0x00000022,0x000300f7,0x00000025,0x00000000,0x000400fa,
0x00000023,0x00000024,0x00000025,0x000200f8,0x00000024,0x00050041,0x00000026,0x00000027,
0x0000001b,0x00000022,0x0004003d,0x00000006,0x00000028,0x00000027,0x0004007e,0x00000006,
0x00000029,0x00000028,0x00050041,0x00000026,0x0000002a,0x0000001b,0x00000022,0x0003003e,
0x0000002a,0x00000029,0x000200f9,0x00000025,0x000200f8,0x00000025,0x00050041,0x0000001e,
0x0000002c,0x00000015,0x0000002b,0x0004003d,0x00000012,0x0000002d,0x0000002c,0x000500ab,
0x00000021,0x0000002e,0x0000002d,0x00000022,0x000300f7,0x00000030,0x00000000,0x000400fa,
0x0000002e,0x0000002f,0x00000030,0x000200f8,0x0000002f,0x00050041,0x00000026,0x00000032,
0x0000001b,0x00000031,0x0004003d,0x00000006,0x00000033,0x00000032,0x0004007e,0x00000006,
0x00000034,0x00000033,0x00050041,0x00000026,0x00000035,0x0000001b,0x00000031,0x0003003e,
0x00000035,0x00000034,0x000200f9,0x00000030,0x000200f8,0x00000030,0x00050041,0x00000017,
0x00000038,0x00000015,0x00000037,0x0004003d,0x00000007,0x00000039,0x00000038,0x0004003d,
0x00000007,0x0000003a,0x0000001b,0x00050080,0x00000007,0x0000003b,0x00000039,0x0000003a,
0x0003003e,0x00000036,0x0000003b,0x0004003d,0x00000007,0x0000003c,0x00000036,0x000500b1,
0x0000003f,0x00000040,0x0000003c,0x0000003e,0x0004009a,0x00000021,0x00000041,0x00000040,
0x000400a8,0x00000021,0x00000042,0x00000041,0x000300f7,0x00000044,0x00000000,0x000400fa,
0x00000042,0x00000043,0x00000044,0x000200f8,0x00000043,0x00050041,0x00000017,0x00000045,
0x00000015,0x0000003d,0x0004003d,0x00000007,0x00000046,0x00000045,0x0004003d,0x00000007,
0x00000047,0x00000036,0x000500b3,0x0000003f,0x00000048,0x00000046,0x00000047,0x0004009a,
0x00000021,0x00000049,0x00000048,0x000200f9,0x00000044,0x000200f8,0x00000044,0x000700f5,
0x00000021,0x0000004a,0x00000041,0x00000030,0x00000049,0x00000043,0x000300f7,0x0000004c,
0x00000000,0x000400fa,0x0000004a,0x0000004b,0x00000052,0x000200f8,0x0000004b,0x0003003e,
0x0000004e,0x0000004f,0x0003003e,0x00000051,0x00000022,0x000200f9,0x0000004c,0x000200f8,
0x00000052,0x0004003d,0x00000053,0x00000056,0x00000055,0x0004003d,0x00000007,0x00000057,
0x00000036,0x0007005f,0x0000000b,0x00000058,0x00000056,0x00000057,0x00000040,0x0000003d,
0x00050051,0x0000000a,0x00000059,0x00000058,0x00000000,0x0003003e,0x0000004e,0x00000059,
0x000200f9,0x0000004c,0x000200f8,0x0000004c,0x0004003d,0x0000000a,0x0000005c,0x0000004e,
0x0003003e,0x0000005b,0x0000005c,0x000100fd,0x00010038
};
#if 0 // Generated from:
#version 450 core
#extension GL_EXT_samplerless_texture_functions : require
#extension GL_ARB_shader_stencil_export : require
layout(push_constant)uniform PushConstants {
ivec2 srcExtent;
ivec2 srcOffset;
ivec2 destOffset;
int srcLayer;
bool flipX;
bool flipY;
} params;
layout(set = 0, binding = 0)uniform texture2DMS depth;
void main()
{
ivec2 destSubImageCoords = ivec2(gl_FragCoord . xy)- params . destOffset;
ivec2 srcSubImageCoords = destSubImageCoords;
if(params . flipX)
srcSubImageCoords . x = - srcSubImageCoords . x;
if(params . flipY)
srcSubImageCoords . y = - srcSubImageCoords . y;
ivec2 srcImageCoords = params . srcOffset + srcSubImageCoords;
float depthValue;
uint stencilValue;
if(any(lessThan(srcImageCoords, ivec2(0)))||
any(lessThanEqual(params . srcExtent, srcImageCoords)))
{
depthValue = 0;
stencilValue = 0;
}
else
{
depthValue = texelFetch(depth, srcImageCoords, 0). x;
}
gl_FragDepth = depthValue;
}
#endif // Preprocessed code
// 7.12.3226
#pragma once
const uint32_t kResolveDepthStencil_frag_00000001[] = {
0x07230203,0x00010000,0x00080007,0x00000065,0x00000000,0x00020011,0x00000001,0x0006000b,
0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001,
0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x0000000d,0x00000063,0x00030010,
0x00000004,0x00000007,0x00030010,0x00000004,0x0000000c,0x00030003,0x00000002,0x000001c2,
0x00090004,0x415f4c47,0x735f4252,0x65646168,0x74735f72,0x69636e65,0x78655f6c,0x74726f70,
0x00000000,0x000b0004,0x455f4c47,0x735f5458,0x6c706d61,0x656c7265,0x745f7373,0x75747865,
0x665f6572,0x74636e75,0x736e6f69,0x00000000,0x00040005,0x00000004,0x6e69616d,0x00000000,
0x00070005,0x00000009,0x74736564,0x49627553,0x6567616d,0x726f6f43,0x00007364,0x00060005,
0x0000000d,0x465f6c67,0x43676172,0x64726f6f,0x00000000,0x00060005,0x00000013,0x68737550,
0x736e6f43,0x746e6174,0x00000073,0x00060006,0x00000013,0x00000000,0x45637273,0x6e657478,
0x00000074,0x00060006,0x00000013,0x00000001,0x4f637273,0x65736666,0x00000074,0x00060006,
0x00000013,0x00000002,0x74736564,0x7366664f,0x00007465,0x00060006,0x00000013,0x00000003,
0x4c637273,0x72657961,0x00000000,0x00050006,0x00000013,0x00000004,0x70696c66,0x00000058,
0x00050006,0x00000013,0x00000005,0x70696c66,0x00000059,0x00040005,0x00000015,0x61726170,
0x0000736d,0x00070005,0x0000001b,0x53637273,0x6d496275,0x43656761,0x64726f6f,0x00000073,
0x00060005,0x00000036,0x49637273,0x6567616d,0x726f6f43,0x00007364,0x00050005,0x0000004e,
0x74706564,0x6c615668,0x00006575,0x00060005,0x00000051,0x6e657473,0x566c6963,0x65756c61,
0x00000000,0x00040005,0x00000055,0x74706564,0x00000068,0x00060005,0x00000063,0x465f6c67,
0x44676172,0x68747065,0x00000000,0x00040047,0x0000000d,0x0000000b,0x0000000f,0x00050048,
0x00000013,0x00000000,0x00000023,0x00000000,0x00050048,0x00000013,0x00000001,0x00000023,
0x00000008,0x00050048,0x00000013,0x00000002,0x00000023,0x00000010,0x00050048,0x00000013,
0x00000003,0x00000023,0x00000018,0x00050048,0x00000013,0x00000004,0x00000023,0x0000001c,
0x00050048,0x00000013,0x00000005,0x00000023,0x00000020,0x00030047,0x00000013,0x00000002,
0x00040047,0x00000055,0x00000022,0x00000000,0x00040047,0x00000055,0x00000021,0x00000000,
0x00040047,0x00000063,0x0000000b,0x00000016,0x00020013,0x00000002,0x00030021,0x00000003,
0x00000002,0x00040015,0x00000006,0x00000020,0x00000001,0x00040017,0x00000007,0x00000006,
0x00000002,0x00040020,0x00000008,0x00000007,0x00000007,0x00030016,0x0000000a,0x00000020,
0x00040017,0x0000000b,0x0000000a,0x00000004,0x00040020,0x0000000c,0x00000001,0x0000000b,
0x0004003b,0x0000000c,0x0000000d,0x00000001,0x00040017,0x0000000e,0x0000000a,0x00000002,
0x00040015,0x00000012,0x00000020,0x00000000,0x0008001e,0x00000013,0x00000007,0x00000007,
0x00000007,0x00000006,0x00000012,0x00000012,0x00040020,0x00000014,0x00000009,0x00000013,
0x0004003b,0x00000014,0x00000015,0x00000009,0x0004002b,0x00000006,0x00000016,0x00000002,
0x00040020,0x00000017,0x00000009,0x00000007,0x0004002b,0x00000006,0x0000001d,0x00000004,
0x00040020,0x0000001e,0x00000009,0x00000012,0x00020014,0x00000021,0x0004002b,0x00000012,
0x00000022,0x00000000,0x00040020,0x00000026,0x00000007,0x00000006,0x0004002b,0x00000006,
0x0000002b,0x00000005,0x0004002b,0x00000012,0x00000031,0x00000001,0x0004002b,0x00000006,
0x00000037,0x00000001,0x0004002b,0x00000006,0x0000003d,0x00000000,0x0005002c,0x00000007,
0x0000003e,0x0000003d,0x0000003d,0x00040017,0x0000003f,0x00000021,0x00000002,0x00040020,
0x0000004d,0x00000007,0x0000000a,0x0004002b,0x0000000a,0x0000004f,0x00000000,0x00040020,
0x00000050,0x00000007,0x00000012,0x00090019,0x00000053,0x0000000a,0x00000001,0x00000000,
0x00000001,0x00000001,0x00000001,0x00000000,0x00040020,0x00000054,0x00000000,0x00000053,
0x0004003b,0x00000054,0x00000055,0x00000000,0x0004002b,0x00000006,0x00000058,0x00000003,
0x00040020,0x00000059,0x00000009,0x00000006,0x00040017,0x0000005c,0x00000006,0x00000003,
0x00040020,0x00000062,0x00000003,0x0000000a,0x0004003b,0x00000062,0x00000063,0x00000003,
0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003b,
0x00000008,0x00000009,0x00000007,0x0004003b,0x00000008,0x0000001b,0x00000007,0x0004003b,
0x00000008,0x00000036,0x00000007,0x0004003b,0x0000004d,0x0000004e,0x00000007,0x0004003b,
0x00000050,0x00000051,0x00000007,0x0004003d,0x0000000b,0x0000000f,0x0000000d,0x0007004f,
0x0000000e,0x00000010,0x0000000f,0x0000000f,0x00000000,0x00000001,0x0004006e,0x00000007,
0x00000011,0x00000010,0x00050041,0x00000017,0x00000018,0x00000015,0x00000016,0x0004003d,
0x00000007,0x00000019,0x00000018,0x00050082,0x00000007,0x0000001a,0x00000011,0x00000019,
0x0003003e,0x00000009,0x0000001a,0x0004003d,0x00000007,0x0000001c,0x00000009,0x0003003e,
0x0000001b,0x0000001c,0x00050041,0x0000001e,0x0000001f,0x00000015,0x0000001d,0x0004003d,
0x00000012,0x00000020,0x0000001f,0x000500ab,0x00000021,0x00000023,0x00000020,0x00000022,
0x000300f7,0x00000025,0x00000000,0x000400fa,0x00000023,0x00000024,0x00000025,0x000200f8,
0x00000024,0x00050041,0x00000026,0x00000027,0x0000001b,0x00000022,0x0004003d,0x00000006,
0x00000028,0x00000027,0x0004007e,0x00000006,0x00000029,0x00000028,0x00050041,0x00000026,
0x0000002a,0x0000001b,0x00000022,0x0003003e,0x0000002a,0x00000029,0x000200f9,0x00000025,
0x000200f8,0x00000025,0x00050041,0x0000001e,0x0000002c,0x00000015,0x0000002b,0x0004003d,
0x00000012,0x0000002d,0x0000002c,0x000500ab,0x00000021,0x0000002e,0x0000002d,0x00000022,
0x000300f7,0x00000030,0x00000000,0x000400fa,0x0000002e,0x0000002f,0x00000030,0x000200f8,
0x0000002f,0x00050041,0x00000026,0x00000032,0x0000001b,0x00000031,0x0004003d,0x00000006,
0x00000033,0x00000032,0x0004007e,0x00000006,0x00000034,0x00000033,0x00050041,0x00000026,
0x00000035,0x0000001b,0x00000031,0x0003003e,0x00000035,0x00000034,0x000200f9,0x00000030,
0x000200f8,0x00000030,0x00050041,0x00000017,0x00000038,0x00000015,0x00000037,0x0004003d,
0x00000007,0x00000039,0x00000038,0x0004003d,0x00000007,0x0000003a,0x0000001b,0x00050080,
0x00000007,0x0000003b,0x00000039,0x0000003a,0x0003003e,0x00000036,0x0000003b,0x0004003d,
0x00000007,0x0000003c,0x00000036,0x000500b1,0x0000003f,0x00000040,0x0000003c,0x0000003e,
0x0004009a,0x00000021,0x00000041,0x00000040,0x000400a8,0x00000021,0x00000042,0x00000041,
0x000300f7,0x00000044,0x00000000,0x000400fa,0x00000042,0x00000043,0x00000044,0x000200f8,
0x00000043,0x00050041,0x00000017,0x00000045,0x00000015,0x0000003d,0x0004003d,0x00000007,
0x00000046,0x00000045,0x0004003d,0x00000007,0x00000047,0x00000036,0x000500b3,0x0000003f,
0x00000048,0x00000046,0x00000047,0x0004009a,0x00000021,0x00000049,0x00000048,0x000200f9,
0x00000044,0x000200f8,0x00000044,0x000700f5,0x00000021,0x0000004a,0x00000041,0x00000030,
0x00000049,0x00000043,0x000300f7,0x0000004c,0x00000000,0x000400fa,0x0000004a,0x0000004b,
0x00000052,0x000200f8,0x0000004b,0x0003003e,0x0000004e,0x0000004f,0x0003003e,0x00000051,
0x00000022,0x000200f9,0x0000004c,0x000200f8,0x00000052,0x0004003d,0x00000053,0x00000056,
0x00000055,0x0004003d,0x00000007,0x00000057,0x00000036,0x00050041,0x00000059,0x0000005a,
0x00000015,0x00000058,0x0004003d,0x00000006,0x0000005b,0x0000005a,0x00050051,0x00000006,
0x0000005d,0x00000057,0x00000000,0x00050051,0x00000006,0x0000005e,0x00000057,0x00000001,
0x00060050,0x0000005c,0x0000005f,0x0000005d,0x0000005e,0x0000005b,0x0007005f,0x0000000b,
0x00000060,0x00000056,0x0000005f,0x00000040,0x0000003d,0x00050051,0x0000000a,0x00000061,
0x00000060,0x00000000,0x0003003e,0x0000004e,0x00000061,0x000200f9,0x0000004c,0x000200f8,
0x0000004c,0x0004003d,0x0000000a,0x00000064,0x0000004e,0x0003003e,0x00000063,0x00000064,
0x000100fd,0x00010038
};
#if 0 // Generated from:
#version 450 core
#extension GL_EXT_samplerless_texture_functions : require
#extension GL_ARB_shader_stencil_export : require
layout(push_constant)uniform PushConstants {
ivec2 srcExtent;
ivec2 srcOffset;
ivec2 destOffset;
int srcLayer;
bool flipX;
bool flipY;
} params;
layout(set = 0, binding = 0)uniform texture2DMSArray depth;
void main()
{
ivec2 destSubImageCoords = ivec2(gl_FragCoord . xy)- params . destOffset;
ivec2 srcSubImageCoords = destSubImageCoords;
if(params . flipX)
srcSubImageCoords . x = - srcSubImageCoords . x;
if(params . flipY)
srcSubImageCoords . y = - srcSubImageCoords . y;
ivec2 srcImageCoords = params . srcOffset + srcSubImageCoords;
float depthValue;
uint stencilValue;
if(any(lessThan(srcImageCoords, ivec2(0)))||
any(lessThanEqual(params . srcExtent, srcImageCoords)))
{
depthValue = 0;
stencilValue = 0;
}
else
{
depthValue = texelFetch(depth, ivec3(srcImageCoords, params . srcLayer), 0). x;
}
gl_FragDepth = depthValue;
}
#endif // Preprocessed code
// 7.12.3226
#pragma once
const uint32_t kResolveDepthStencil_frag_00000002[] = {
0x07230203,0x00010000,0x00080007,0x0000005f,0x00000000,0x00020011,0x00000001,0x00020011,
0x00001395,0x0009000a,0x5f565053,0x5f545845,0x64616873,0x735f7265,0x636e6574,0x655f6c69,
0x726f7078,0x00000074,0x0006000b,0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,
0x0003000e,0x00000000,0x00000001,0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,
0x0000000d,0x0000005c,0x00030010,0x00000004,0x00000007,0x00030003,0x00000002,0x000001c2,
0x00090004,0x415f4c47,0x735f4252,0x65646168,0x74735f72,0x69636e65,0x78655f6c,0x74726f70,
0x00000000,0x000b0004,0x455f4c47,0x735f5458,0x6c706d61,0x656c7265,0x745f7373,0x75747865,
0x665f6572,0x74636e75,0x736e6f69,0x00000000,0x00040005,0x00000004,0x6e69616d,0x00000000,
0x00070005,0x00000009,0x74736564,0x49627553,0x6567616d,0x726f6f43,0x00007364,0x00060005,
0x0000000d,0x465f6c67,0x43676172,0x64726f6f,0x00000000,0x00060005,0x00000013,0x68737550,
0x736e6f43,0x746e6174,0x00000073,0x00060006,0x00000013,0x00000000,0x45637273,0x6e657478,
0x00000074,0x00060006,0x00000013,0x00000001,0x4f637273,0x65736666,0x00000074,0x00060006,
0x00000013,0x00000002,0x74736564,0x7366664f,0x00007465,0x00060006,0x00000013,0x00000003,
0x4c637273,0x72657961,0x00000000,0x00050006,0x00000013,0x00000004,0x70696c66,0x00000058,
0x00050006,0x00000013,0x00000005,0x70696c66,0x00000059,0x00040005,0x00000015,0x61726170,
0x0000736d,0x00070005,0x0000001b,0x53637273,0x6d496275,0x43656761,0x64726f6f,0x00000073,
0x00060005,0x00000036,0x49637273,0x6567616d,0x726f6f43,0x00007364,0x00050005,0x0000004e,
0x74706564,0x6c615668,0x00006575,0x00060005,0x00000051,0x6e657473,0x566c6963,0x65756c61,
0x00000000,0x00040005,0x00000055,0x6e657473,0x006c6963,0x00080005,0x0000005c,0x465f6c67,
0x53676172,0x636e6574,0x65526c69,0x42524166,0x00000000,0x00040047,0x0000000d,0x0000000b,
0x0000000f,0x00050048,0x00000013,0x00000000,0x00000023,0x00000000,0x00050048,0x00000013,
0x00000001,0x00000023,0x00000008,0x00050048,0x00000013,0x00000002,0x00000023,0x00000010,
0x00050048,0x00000013,0x00000003,0x00000023,0x00000018,0x00050048,0x00000013,0x00000004,
0x00000023,0x0000001c,0x00050048,0x00000013,0x00000005,0x00000023,0x00000020,0x00030047,
0x00000013,0x00000002,0x00040047,0x00000055,0x00000022,0x00000000,0x00040047,0x00000055,
0x00000021,0x00000001,0x00040047,0x0000005c,0x0000000b,0x00001396,0x00020013,0x00000002,
0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,0x00000020,0x00000001,0x00040017,
0x00000007,0x00000006,0x00000002,0x00040020,0x00000008,0x00000007,0x00000007,0x00030016,
0x0000000a,0x00000020,0x00040017,0x0000000b,0x0000000a,0x00000004,0x00040020,0x0000000c,
0x00000001,0x0000000b,0x0004003b,0x0000000c,0x0000000d,0x00000001,0x00040017,0x0000000e,
0x0000000a,0x00000002,0x00040015,0x00000012,0x00000020,0x00000000,0x0008001e,0x00000013,
0x00000007,0x00000007,0x00000007,0x00000006,0x00000012,0x00000012,0x00040020,0x00000014,
0x00000009,0x00000013,0x0004003b,0x00000014,0x00000015,0x00000009,0x0004002b,0x00000006,
0x00000016,0x00000002,0x00040020,0x00000017,0x00000009,0x00000007,0x0004002b,0x00000006,
0x0000001d,0x00000004,0x00040020,0x0000001e,0x00000009,0x00000012,0x00020014,0x00000021,
0x0004002b,0x00000012,0x00000022,0x00000000,0x00040020,0x00000026,0x00000007,0x00000006,
0x0004002b,0x00000006,0x0000002b,0x00000005,0x0004002b,0x00000012,0x00000031,0x00000001,
0x0004002b,0x00000006,0x00000037,0x00000001,0x0004002b,0x00000006,0x0000003d,0x00000000,
0x0005002c,0x00000007,0x0000003e,0x0000003d,0x0000003d,0x00040017,0x0000003f,0x00000021,
0x00000002,0x00040020,0x0000004d,0x00000007,0x0000000a,0x0004002b,0x0000000a,0x0000004f,
0x00000000,0x00040020,0x00000050,0x00000007,0x00000012,0x00090019,0x00000053,0x00000012,
0x00000001,0x00000000,0x00000000,0x00000001,0x00000001,0x00000000,0x00040020,0x00000054,
0x00000000,0x00000053,0x0004003b,0x00000054,0x00000055,0x00000000,0x00040017,0x00000058,
0x00000012,0x00000004,0x00040020,0x0000005b,0x00000003,0x00000006,0x0004003b,0x0000005b,
0x0000005c,0x00000003,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8,
0x00000005,0x0004003b,0x00000008,0x00000009,0x00000007,0x0004003b,0x00000008,0x0000001b,
0x00000007,0x0004003b,0x00000008,0x00000036,0x00000007,0x0004003b,0x0000004d,0x0000004e,
0x00000007,0x0004003b,0x00000050,0x00000051,0x00000007,0x0004003d,0x0000000b,0x0000000f,
0x0000000d,0x0007004f,0x0000000e,0x00000010,0x0000000f,0x0000000f,0x00000000,0x00000001,
0x0004006e,0x00000007,0x00000011,0x00000010,0x00050041,0x00000017,0x00000018,0x00000015,
0x00000016,0x0004003d,0x00000007,0x00000019,0x00000018,0x00050082,0x00000007,0x0000001a,
0x00000011,0x00000019,0x0003003e,0x00000009,0x0000001a,0x0004003d,0x00000007,0x0000001c,
0x00000009,0x0003003e,0x0000001b,0x0000001c,0x00050041,0x0000001e,0x0000001f,0x00000015,
0x0000001d,0x0004003d,0x00000012,0x00000020,0x0000001f,0x000500ab,0x00000021,0x00000023,
0x00000020,0x00000022,0x000300f7,0x00000025,0x00000000,0x000400fa,0x00000023,0x00000024,
0x00000025,0x000200f8,0x00000024,0x00050041,0x00000026,0x00000027,0x0000001b,0x00000022,
0x0004003d,0x00000006,0x00000028,0x00000027,0x0004007e,0x00000006,0x00000029,0x00000028,
0x00050041,0x00000026,0x0000002a,0x0000001b,0x00000022,0x0003003e,0x0000002a,0x00000029,
0x000200f9,0x00000025,0x000200f8,0x00000025,0x00050041,0x0000001e,0x0000002c,0x00000015,
0x0000002b,0x0004003d,0x00000012,0x0000002d,0x0000002c,0x000500ab,0x00000021,0x0000002e,
0x0000002d,0x00000022,0x000300f7,0x00000030,0x00000000,0x000400fa,0x0000002e,0x0000002f,
0x00000030,0x000200f8,0x0000002f,0x00050041,0x00000026,0x00000032,0x0000001b,0x00000031,
0x0004003d,0x00000006,0x00000033,0x00000032,0x0004007e,0x00000006,0x00000034,0x00000033,
0x00050041,0x00000026,0x00000035,0x0000001b,0x00000031,0x0003003e,0x00000035,0x00000034,
0x000200f9,0x00000030,0x000200f8,0x00000030,0x00050041,0x00000017,0x00000038,0x00000015,
0x00000037,0x0004003d,0x00000007,0x00000039,0x00000038,0x0004003d,0x00000007,0x0000003a,
0x0000001b,0x00050080,0x00000007,0x0000003b,0x00000039,0x0000003a,0x0003003e,0x00000036,
0x0000003b,0x0004003d,0x00000007,0x0000003c,0x00000036,0x000500b1,0x0000003f,0x00000040,
0x0000003c,0x0000003e,0x0004009a,0x00000021,0x00000041,0x00000040,0x000400a8,0x00000021,
0x00000042,0x00000041,0x000300f7,0x00000044,0x00000000,0x000400fa,0x00000042,0x00000043,
0x00000044,0x000200f8,0x00000043,0x00050041,0x00000017,0x00000045,0x00000015,0x0000003d,
0x0004003d,0x00000007,0x00000046,0x00000045,0x0004003d,0x00000007,0x00000047,0x00000036,
0x000500b3,0x0000003f,0x00000048,0x00000046,0x00000047,0x0004009a,0x00000021,0x00000049,
0x00000048,0x000200f9,0x00000044,0x000200f8,0x00000044,0x000700f5,0x00000021,0x0000004a,
0x00000041,0x00000030,0x00000049,0x00000043,0x000300f7,0x0000004c,0x00000000,0x000400fa,
0x0000004a,0x0000004b,0x00000052,0x000200f8,0x0000004b,0x0003003e,0x0000004e,0x0000004f,
0x0003003e,0x00000051,0x00000022,0x000200f9,0x0000004c,0x000200f8,0x00000052,0x0004003d,
0x00000053,0x00000056,0x00000055,0x0004003d,0x00000007,0x00000057,0x00000036,0x0007005f,
0x00000058,0x00000059,0x00000056,0x00000057,0x00000040,0x0000003d,0x00050051,0x00000012,
0x0000005a,0x00000059,0x00000000,0x0003003e,0x00000051,0x0000005a,0x000200f9,0x0000004c,
0x000200f8,0x0000004c,0x0004003d,0x00000012,0x0000005d,0x00000051,0x0004007c,0x00000006,
0x0000005e,0x0000005d,0x0003003e,0x0000005c,0x0000005e,0x000100fd,0x00010038
};
#if 0 // Generated from:
#version 450 core
#extension GL_EXT_samplerless_texture_functions : require
#extension GL_ARB_shader_stencil_export : require
layout(push_constant)uniform PushConstants {
ivec2 srcExtent;
ivec2 srcOffset;
ivec2 destOffset;
int srcLayer;
bool flipX;
bool flipY;
} params;
layout(set = 0, binding = 1)uniform utexture2DMS stencil;
void main()
{
ivec2 destSubImageCoords = ivec2(gl_FragCoord . xy)- params . destOffset;
ivec2 srcSubImageCoords = destSubImageCoords;
if(params . flipX)
srcSubImageCoords . x = - srcSubImageCoords . x;
if(params . flipY)
srcSubImageCoords . y = - srcSubImageCoords . y;
ivec2 srcImageCoords = params . srcOffset + srcSubImageCoords;
float depthValue;
uint stencilValue;
if(any(lessThan(srcImageCoords, ivec2(0)))||
any(lessThanEqual(params . srcExtent, srcImageCoords)))
{
depthValue = 0;
stencilValue = 0;
}
else
{
stencilValue = texelFetch(stencil, srcImageCoords, 0). x;
}
gl_FragStencilRefARB = int(stencilValue);
}
#endif // Preprocessed code
// 7.12.3226
#pragma once
const uint32_t kResolveDepthStencil_frag_00000003[] = {
0x07230203,0x00010000,0x00080007,0x00000067,0x00000000,0x00020011,0x00000001,0x00020011,
0x00001395,0x0009000a,0x5f565053,0x5f545845,0x64616873,0x735f7265,0x636e6574,0x655f6c69,
0x726f7078,0x00000074,0x0006000b,0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,
0x0003000e,0x00000000,0x00000001,0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,
0x0000000d,0x00000064,0x00030010,0x00000004,0x00000007,0x00030003,0x00000002,0x000001c2,
0x00090004,0x415f4c47,0x735f4252,0x65646168,0x74735f72,0x69636e65,0x78655f6c,0x74726f70,
0x00000000,0x000b0004,0x455f4c47,0x735f5458,0x6c706d61,0x656c7265,0x745f7373,0x75747865,
0x665f6572,0x74636e75,0x736e6f69,0x00000000,0x00040005,0x00000004,0x6e69616d,0x00000000,
0x00070005,0x00000009,0x74736564,0x49627553,0x6567616d,0x726f6f43,0x00007364,0x00060005,
0x0000000d,0x465f6c67,0x43676172,0x64726f6f,0x00000000,0x00060005,0x00000013,0x68737550,
0x736e6f43,0x746e6174,0x00000073,0x00060006,0x00000013,0x00000000,0x45637273,0x6e657478,
0x00000074,0x00060006,0x00000013,0x00000001,0x4f637273,0x65736666,0x00000074,0x00060006,
0x00000013,0x00000002,0x74736564,0x7366664f,0x00007465,0x00060006,0x00000013,0x00000003,
0x4c637273,0x72657961,0x00000000,0x00050006,0x00000013,0x00000004,0x70696c66,0x00000058,
0x00050006,0x00000013,0x00000005,0x70696c66,0x00000059,0x00040005,0x00000015,0x61726170,
0x0000736d,0x00070005,0x0000001b,0x53637273,0x6d496275,0x43656761,0x64726f6f,0x00000073,
0x00060005,0x00000036,0x49637273,0x6567616d,0x726f6f43,0x00007364,0x00050005,0x0000004e,
0x74706564,0x6c615668,0x00006575,0x00060005,0x00000051,0x6e657473,0x566c6963,0x65756c61,
0x00000000,0x00040005,0x00000055,0x6e657473,0x006c6963,0x00080005,0x00000064,0x465f6c67,
0x53676172,0x636e6574,0x65526c69,0x42524166,0x00000000,0x00040047,0x0000000d,0x0000000b,
0x0000000f,0x00050048,0x00000013,0x00000000,0x00000023,0x00000000,0x00050048,0x00000013,
0x00000001,0x00000023,0x00000008,0x00050048,0x00000013,0x00000002,0x00000023,0x00000010,
0x00050048,0x00000013,0x00000003,0x00000023,0x00000018,0x00050048,0x00000013,0x00000004,
0x00000023,0x0000001c,0x00050048,0x00000013,0x00000005,0x00000023,0x00000020,0x00030047,
0x00000013,0x00000002,0x00040047,0x00000055,0x00000022,0x00000000,0x00040047,0x00000055,
0x00000021,0x00000001,0x00040047,0x00000064,0x0000000b,0x00001396,0x00020013,0x00000002,
0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,0x00000020,0x00000001,0x00040017,
0x00000007,0x00000006,0x00000002,0x00040020,0x00000008,0x00000007,0x00000007,0x00030016,
0x0000000a,0x00000020,0x00040017,0x0000000b,0x0000000a,0x00000004,0x00040020,0x0000000c,
0x00000001,0x0000000b,0x0004003b,0x0000000c,0x0000000d,0x00000001,0x00040017,0x0000000e,
0x0000000a,0x00000002,0x00040015,0x00000012,0x00000020,0x00000000,0x0008001e,0x00000013,
0x00000007,0x00000007,0x00000007,0x00000006,0x00000012,0x00000012,0x00040020,0x00000014,
0x00000009,0x00000013,0x0004003b,0x00000014,0x00000015,0x00000009,0x0004002b,0x00000006,
0x00000016,0x00000002,0x00040020,0x00000017,0x00000009,0x00000007,0x0004002b,0x00000006,
0x0000001d,0x00000004,0x00040020,0x0000001e,0x00000009,0x00000012,0x00020014,0x00000021,
0x0004002b,0x00000012,0x00000022,0x00000000,0x00040020,0x00000026,0x00000007,0x00000006,
0x0004002b,0x00000006,0x0000002b,0x00000005,0x0004002b,0x00000012,0x00000031,0x00000001,
0x0004002b,0x00000006,0x00000037,0x00000001,0x0004002b,0x00000006,0x0000003d,0x00000000,
0x0005002c,0x00000007,0x0000003e,0x0000003d,0x0000003d,0x00040017,0x0000003f,0x00000021,
0x00000002,0x00040020,0x0000004d,0x00000007,0x0000000a,0x0004002b,0x0000000a,0x0000004f,
0x00000000,0x00040020,0x00000050,0x00000007,0x00000012,0x00090019,0x00000053,0x00000012,
0x00000001,0x00000000,0x00000001,0x00000001,0x00000001,0x00000000,0x00040020,0x00000054,
0x00000000,0x00000053,0x0004003b,0x00000054,0x00000055,0x00000000,0x0004002b,0x00000006,
0x00000058,0x00000003,0x00040020,0x00000059,0x00000009,0x00000006,0x00040017,0x0000005c,
0x00000006,0x00000003,0x00040017,0x00000060,0x00000012,0x00000004,0x00040020,0x00000063,
0x00000003,0x00000006,0x0004003b,0x00000063,0x00000064,0x00000003,0x00050036,0x00000002,
0x00000004,0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003b,0x00000008,0x00000009,
0x00000007,0x0004003b,0x00000008,0x0000001b,0x00000007,0x0004003b,0x00000008,0x00000036,
0x00000007,0x0004003b,0x0000004d,0x0000004e,0x00000007,0x0004003b,0x00000050,0x00000051,
0x00000007,0x0004003d,0x0000000b,0x0000000f,0x0000000d,0x0007004f,0x0000000e,0x00000010,
0x0000000f,0x0000000f,0x00000000,0x00000001,0x0004006e,0x00000007,0x00000011,0x00000010,
0x00050041,0x00000017,0x00000018,0x00000015,0x00000016,0x0004003d,0x00000007,0x00000019,
0x00000018,0x00050082,0x00000007,0x0000001a,0x00000011,0x00000019,0x0003003e,0x00000009,
0x0000001a,0x0004003d,0x00000007,0x0000001c,0x00000009,0x0003003e,0x0000001b,0x0000001c,
0x00050041,0x0000001e,0x0000001f,0x00000015,0x0000001d,0x0004003d,0x00000012,0x00000020,
0x0000001f,0x000500ab,0x00000021,0x00000023,0x00000020,0x00000022,0x000300f7,0x00000025,
0x00000000,0x000400fa,0x00000023,0x00000024,0x00000025,0x000200f8,0x00000024,0x00050041,
0x00000026,0x00000027,0x0000001b,0x00000022,0x0004003d,0x00000006,0x00000028,0x00000027,
0x0004007e,0x00000006,0x00000029,0x00000028,0x00050041,0x00000026,0x0000002a,0x0000001b,
0x00000022,0x0003003e,0x0000002a,0x00000029,0x000200f9,0x00000025,0x000200f8,0x00000025,
0x00050041,0x0000001e,0x0000002c,0x00000015,0x0000002b,0x0004003d,0x00000012,0x0000002d,
0x0000002c,0x000500ab,0x00000021,0x0000002e,0x0000002d,0x00000022,0x000300f7,0x00000030,
0x00000000,0x000400fa,0x0000002e,0x0000002f,0x00000030,0x000200f8,0x0000002f,0x00050041,
0x00000026,0x00000032,0x0000001b,0x00000031,0x0004003d,0x00000006,0x00000033,0x00000032,
0x0004007e,0x00000006,0x00000034,0x00000033,0x00050041,0x00000026,0x00000035,0x0000001b,
0x00000031,0x0003003e,0x00000035,0x00000034,0x000200f9,0x00000030,0x000200f8,0x00000030,
0x00050041,0x00000017,0x00000038,0x00000015,0x00000037,0x0004003d,0x00000007,0x00000039,
0x00000038,0x0004003d,0x00000007,0x0000003a,0x0000001b,0x00050080,0x00000007,0x0000003b,
0x00000039,0x0000003a,0x0003003e,0x00000036,0x0000003b,0x0004003d,0x00000007,0x0000003c,
0x00000036,0x000500b1,0x0000003f,0x00000040,0x0000003c,0x0000003e,0x0004009a,0x00000021,
0x00000041,0x00000040,0x000400a8,0x00000021,0x00000042,0x00000041,0x000300f7,0x00000044,
0x00000000,0x000400fa,0x00000042,0x00000043,0x00000044,0x000200f8,0x00000043,0x00050041,
0x00000017,0x00000045,0x00000015,0x0000003d,0x0004003d,0x00000007,0x00000046,0x00000045,
0x0004003d,0x00000007,0x00000047,0x00000036,0x000500b3,0x0000003f,0x00000048,0x00000046,
0x00000047,0x0004009a,0x00000021,0x00000049,0x00000048,0x000200f9,0x00000044,0x000200f8,
0x00000044,0x000700f5,0x00000021,0x0000004a,0x00000041,0x00000030,0x00000049,0x00000043,
0x000300f7,0x0000004c,0x00000000,0x000400fa,0x0000004a,0x0000004b,0x00000052,0x000200f8,
0x0000004b,0x0003003e,0x0000004e,0x0000004f,0x0003003e,0x00000051,0x00000022,0x000200f9,
0x0000004c,0x000200f8,0x00000052,0x0004003d,0x00000053,0x00000056,0x00000055,0x0004003d,
0x00000007,0x00000057,0x00000036,0x00050041,0x00000059,0x0000005a,0x00000015,0x00000058,
0x0004003d,0x00000006,0x0000005b,0x0000005a,0x00050051,0x00000006,0x0000005d,0x00000057,
0x00000000,0x00050051,0x00000006,0x0000005e,0x00000057,0x00000001,0x00060050,0x0000005c,
0x0000005f,0x0000005d,0x0000005e,0x0000005b,0x0007005f,0x00000060,0x00000061,0x00000056,
0x0000005f,0x00000040,0x0000003d,0x00050051,0x00000012,0x00000062,0x00000061,0x00000000,
0x0003003e,0x00000051,0x00000062,0x000200f9,0x0000004c,0x000200f8,0x0000004c,0x0004003d,
0x00000012,0x00000065,0x00000051,0x0004007c,0x00000006,0x00000066,0x00000065,0x0003003e,
0x00000064,0x00000066,0x000100fd,0x00010038
};
#if 0 // Generated from:
#version 450 core
#extension GL_EXT_samplerless_texture_functions : require
#extension GL_ARB_shader_stencil_export : require
layout(push_constant)uniform PushConstants {
ivec2 srcExtent;
ivec2 srcOffset;
ivec2 destOffset;
int srcLayer;
bool flipX;
bool flipY;
} params;
layout(set = 0, binding = 1)uniform utexture2DMSArray stencil;
void main()
{
ivec2 destSubImageCoords = ivec2(gl_FragCoord . xy)- params . destOffset;
ivec2 srcSubImageCoords = destSubImageCoords;
if(params . flipX)
srcSubImageCoords . x = - srcSubImageCoords . x;
if(params . flipY)
srcSubImageCoords . y = - srcSubImageCoords . y;
ivec2 srcImageCoords = params . srcOffset + srcSubImageCoords;
float depthValue;
uint stencilValue;
if(any(lessThan(srcImageCoords, ivec2(0)))||
any(lessThanEqual(params . srcExtent, srcImageCoords)))
{
depthValue = 0;
stencilValue = 0;
}
else
{
stencilValue = texelFetch(stencil, ivec3(srcImageCoords, params . srcLayer), 0). x;
}
gl_FragStencilRefARB = int(stencilValue);
}
#endif // Preprocessed code
// 7.12.3226
#pragma once
const uint32_t kResolveDepthStencil_frag_00000004[] = {
0x07230203,0x00010000,0x00080007,0x00000069,0x00000000,0x00020011,0x00000001,0x00020011,
0x00001395,0x0009000a,0x5f565053,0x5f545845,0x64616873,0x735f7265,0x636e6574,0x655f6c69,
0x726f7078,0x00000074,0x0006000b,0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,
0x0003000e,0x00000000,0x00000001,0x0008000f,0x00000004,0x00000004,0x6e69616d,0x00000000,
0x0000000d,0x00000063,0x00000066,0x00030010,0x00000004,0x00000007,0x00030010,0x00000004,
0x0000000c,0x00030003,0x00000002,0x000001c2,0x00090004,0x415f4c47,0x735f4252,0x65646168,
0x74735f72,0x69636e65,0x78655f6c,0x74726f70,0x00000000,0x000b0004,0x455f4c47,0x735f5458,
0x6c706d61,0x656c7265,0x745f7373,0x75747865,0x665f6572,0x74636e75,0x736e6f69,0x00000000,
0x00040005,0x00000004,0x6e69616d,0x00000000,0x00070005,0x00000009,0x74736564,0x49627553,
0x6567616d,0x726f6f43,0x00007364,0x00060005,0x0000000d,0x465f6c67,0x43676172,0x64726f6f,
0x00000000,0x00060005,0x00000013,0x68737550,0x736e6f43,0x746e6174,0x00000073,0x00060006,
0x00000013,0x00000000,0x45637273,0x6e657478,0x00000074,0x00060006,0x00000013,0x00000001,
0x4f637273,0x65736666,0x00000074,0x00060006,0x00000013,0x00000002,0x74736564,0x7366664f,
0x00007465,0x00060006,0x00000013,0x00000003,0x4c637273,0x72657961,0x00000000,0x00050006,
0x00000013,0x00000004,0x70696c66,0x00000058,0x00050006,0x00000013,0x00000005,0x70696c66,
0x00000059,0x00040005,0x00000015,0x61726170,0x0000736d,0x00070005,0x0000001b,0x53637273,
0x6d496275,0x43656761,0x64726f6f,0x00000073,0x00060005,0x00000036,0x49637273,0x6567616d,
0x726f6f43,0x00007364,0x00050005,0x0000004e,0x74706564,0x6c615668,0x00006575,0x00060005,
0x00000051,0x6e657473,0x566c6963,0x65756c61,0x00000000,0x00040005,0x00000055,0x74706564,
0x00000068,0x00040005,0x0000005c,0x6e657473,0x006c6963,0x00060005,0x00000063,0x465f6c67,
0x44676172,0x68747065,0x00000000,0x00080005,0x00000066,0x465f6c67,0x53676172,0x636e6574,
0x65526c69,0x42524166,0x00000000,0x00040047,0x0000000d,0x0000000b,0x0000000f,0x00050048,
0x00000013,0x00000000,0x00000023,0x00000000,0x00050048,0x00000013,0x00000001,0x00000023,
0x00000008,0x00050048,0x00000013,0x00000002,0x00000023,0x00000010,0x00050048,0x00000013,
0x00000003,0x00000023,0x00000018,0x00050048,0x00000013,0x00000004,0x00000023,0x0000001c,
0x00050048,0x00000013,0x00000005,0x00000023,0x00000020,0x00030047,0x00000013,0x00000002,
0x00040047,0x00000055,0x00000022,0x00000000,0x00040047,0x00000055,0x00000021,0x00000000,
0x00040047,0x0000005c,0x00000022,0x00000000,0x00040047,0x0000005c,0x00000021,0x00000001,
0x00040047,0x00000063,0x0000000b,0x00000016,0x00040047,0x00000066,0x0000000b,0x00001396,
0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00040015,0x00000006,0x00000020,
0x00000001,0x00040017,0x00000007,0x00000006,0x00000002,0x00040020,0x00000008,0x00000007,
0x00000007,0x00030016,0x0000000a,0x00000020,0x00040017,0x0000000b,0x0000000a,0x00000004,
0x00040020,0x0000000c,0x00000001,0x0000000b,0x0004003b,0x0000000c,0x0000000d,0x00000001,
0x00040017,0x0000000e,0x0000000a,0x00000002,0x00040015,0x00000012,0x00000020,0x00000000,
0x0008001e,0x00000013,0x00000007,0x00000007,0x00000007,0x00000006,0x00000012,0x00000012,
0x00040020,0x00000014,0x00000009,0x00000013,0x0004003b,0x00000014,0x00000015,0x00000009,
0x0004002b,0x00000006,0x00000016,0x00000002,0x00040020,0x00000017,0x00000009,0x00000007,
0x0004002b,0x00000006,0x0000001d,0x00000004,0x00040020,0x0000001e,0x00000009,0x00000012,
0x00020014,0x00000021,0x0004002b,0x00000012,0x00000022,0x00000000,0x00040020,0x00000026,
0x00000007,0x00000006,0x0004002b,0x00000006,0x0000002b,0x00000005,0x0004002b,0x00000012,
0x00000031,0x00000001,0x0004002b,0x00000006,0x00000037,0x00000001,0x0004002b,0x00000006,
0x0000003d,0x00000000,0x0005002c,0x00000007,0x0000003e,0x0000003d,0x0000003d,0x00040017,
0x0000003f,0x00000021,0x00000002,0x00040020,0x0000004d,0x00000007,0x0000000a,0x0004002b,
0x0000000a,0x0000004f,0x00000000,0x00040020,0x00000050,0x00000007,0x00000012,0x00090019,
0x00000053,0x0000000a,0x00000001,0x00000000,0x00000000,0x00000001,0x00000001,0x00000000,
0x00040020,0x00000054,0x00000000,0x00000053,0x0004003b,0x00000054,0x00000055,0x00000000,
0x00090019,0x0000005a,0x00000012,0x00000001,0x00000000,0x00000000,0x00000001,0x00000001,
0x00000000,0x00040020,0x0000005b,0x00000000,0x0000005a,0x0004003b,0x0000005b,0x0000005c,
0x00000000,0x00040017,0x0000005f,0x00000012,0x00000004,0x00040020,0x00000062,0x00000003,
0x0000000a,0x0004003b,0x00000062,0x00000063,0x00000003,0x00040020,0x00000065,0x00000003,
0x00000006,0x0004003b,0x00000065,0x00000066,0x00000003,0x00050036,0x00000002,0x00000004,
0x00000000,0x00000003,0x000200f8,0x00000005,0x0004003b,0x00000008,0x00000009,0x00000007,
0x0004003b,0x00000008,0x0000001b,0x00000007,0x0004003b,0x00000008,0x00000036,0x00000007,
0x0004003b,0x0000004d,0x0000004e,0x00000007,0x0004003b,0x00000050,0x00000051,0x00000007,
0x0004003d,0x0000000b,0x0000000f,0x0000000d,0x0007004f,0x0000000e,0x00000010,0x0000000f,
0x0000000f,0x00000000,0x00000001,0x0004006e,0x00000007,0x00000011,0x00000010,0x00050041,
0x00000017,0x00000018,0x00000015,0x00000016,0x0004003d,0x00000007,0x00000019,0x00000018,
0x00050082,0x00000007,0x0000001a,0x00000011,0x00000019,0x0003003e,0x00000009,0x0000001a,
0x0004003d,0x00000007,0x0000001c,0x00000009,0x0003003e,0x0000001b,0x0000001c,0x00050041,
0x0000001e,0x0000001f,0x00000015,0x0000001d,0x0004003d,0x00000012,0x00000020,0x0000001f,
0x000500ab,0x00000021,0x00000023,0x00000020,0x00000022,0x000300f7,0x00000025,0x00000000,
0x000400fa,0x00000023,0x00000024,0x00000025,0x000200f8,0x00000024,0x00050041,0x00000026,
0x00000027,0x0000001b,0x00000022,0x0004003d,0x00000006,0x00000028,0x00000027,0x0004007e,
0x00000006,0x00000029,0x00000028,0x00050041,0x00000026,0x0000002a,0x0000001b,0x00000022,
0x0003003e,0x0000002a,0x00000029,0x000200f9,0x00000025,0x000200f8,0x00000025,0x00050041,
0x0000001e,0x0000002c,0x00000015,0x0000002b,0x0004003d,0x00000012,0x0000002d,0x0000002c,
0x000500ab,0x00000021,0x0000002e,0x0000002d,0x00000022,0x000300f7,0x00000030,0x00000000,
0x000400fa,0x0000002e,0x0000002f,0x00000030,0x000200f8,0x0000002f,0x00050041,0x00000026,
0x00000032,0x0000001b,0x00000031,0x0004003d,0x00000006,0x00000033,0x00000032,0x0004007e,
0x00000006,0x00000034,0x00000033,0x00050041,0x00000026,0x00000035,0x0000001b,0x00000031,
0x0003003e,0x00000035,0x00000034,0x000200f9,0x00000030,0x000200f8,0x00000030,0x00050041,
0x00000017,0x00000038,0x00000015,0x00000037,0x0004003d,0x00000007,0x00000039,0x00000038,
0x0004003d,0x00000007,0x0000003a,0x0000001b,0x00050080,0x00000007,0x0000003b,0x00000039,
0x0000003a,0x0003003e,0x00000036,0x0000003b,0x0004003d,0x00000007,0x0000003c,0x00000036,
0x000500b1,0x0000003f,0x00000040,0x0000003c,0x0000003e,0x0004009a,0x00000021,0x00000041,
0x00000040,0x000400a8,0x00000021,0x00000042,0x00000041,0x000300f7,0x00000044,0x00000000,
0x000400fa,0x00000042,0x00000043,0x00000044,0x000200f8,0x00000043,0x00050041,0x00000017,
0x00000045,0x00000015,0x0000003d,0x0004003d,0x00000007,0x00000046,0x00000045,0x0004003d,
0x00000007,0x00000047,0x00000036,0x000500b3,0x0000003f,0x00000048,0x00000046,0x00000047,
0x0004009a,0x00000021,0x00000049,0x00000048,0x000200f9,0x00000044,0x000200f8,0x00000044,
0x000700f5,0x00000021,0x0000004a,0x00000041,0x00000030,0x00000049,0x00000043,0x000300f7,
0x0000004c,0x00000000,0x000400fa,0x0000004a,0x0000004b,0x00000052,0x000200f8,0x0000004b,
0x0003003e,0x0000004e,0x0000004f,0x0003003e,0x00000051,0x00000022,0x000200f9,0x0000004c,
0x000200f8,0x00000052,0x0004003d,0x00000053,0x00000056,0x00000055,0x0004003d,0x00000007,
0x00000057,0x00000036,0x0007005f,0x0000000b,0x00000058,0x00000056,0x00000057,0x00000040,
0x0000003d,0x00050051,0x0000000a,0x00000059,0x00000058,0x00000000,0x0003003e,0x0000004e,
0x00000059,0x0004003d,0x0000005a,0x0000005d,0x0000005c,0x0004003d,0x00000007,0x0000005e,
0x00000036,0x0007005f,0x0000005f,0x00000060,0x0000005d,0x0000005e,0x00000040,0x0000003d,
0x00050051,0x00000012,0x00000061,0x00000060,0x00000000,0x0003003e,0x00000051,0x00000061,
0x000200f9,0x0000004c,0x000200f8,0x0000004c,0x0004003d,0x0000000a,0x00000064,0x0000004e,
0x0003003e,0x00000063,0x00000064,0x0004003d,0x00000012,0x00000067,0x00000051,0x0004007c,
0x00000006,0x00000068,0x00000067,0x0003003e,0x00000066,0x00000068,0x000100fd,0x00010038
};
#if 0 // Generated from:
#version 450 core
#extension GL_EXT_samplerless_texture_functions : require
#extension GL_ARB_shader_stencil_export : require
layout(push_constant)uniform PushConstants {
ivec2 srcExtent;
ivec2 srcOffset;
ivec2 destOffset;
int srcLayer;
bool flipX;
bool flipY;
} params;
layout(set = 0, binding = 0)uniform texture2DMS depth;
layout(set = 0, binding = 1)uniform utexture2DMS stencil;
void main()
{
ivec2 destSubImageCoords = ivec2(gl_FragCoord . xy)- params . destOffset;
ivec2 srcSubImageCoords = destSubImageCoords;
if(params . flipX)
srcSubImageCoords . x = - srcSubImageCoords . x;
if(params . flipY)
srcSubImageCoords . y = - srcSubImageCoords . y;
ivec2 srcImageCoords = params . srcOffset + srcSubImageCoords;
float depthValue;
uint stencilValue;
if(any(lessThan(srcImageCoords, ivec2(0)))||
any(lessThanEqual(params . srcExtent, srcImageCoords)))
{
depthValue = 0;
stencilValue = 0;
}
else
{
depthValue = texelFetch(depth, srcImageCoords, 0). x;
stencilValue = texelFetch(stencil, srcImageCoords, 0). x;
}
gl_FragDepth = depthValue;
gl_FragStencilRefARB = int(stencilValue);
}
#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.
//
// ResolveColor.frag: Resolve multisampled color images.
#version 450 core
#extension GL_EXT_samplerless_texture_functions : require
#define MAKE_SRC_RESOURCE(prefix, type) prefix ## type
#if IsFloat
#define SRC_RESOURCE(type) type
#define Type vec4
#elif IsInt
#define SRC_RESOURCE(type) MAKE_SRC_RESOURCE(i, type)
#define Type ivec4
#elif IsUint
#define SRC_RESOURCE(type) MAKE_SRC_RESOURCE(u, type)
#define Type uvec4
#else
#error "Not all formats are accounted for"
#endif
#if SrcIsArray
#define SRC_RESOURCE_NAME texture2DMSArray
#else
#define SRC_RESOURCE_NAME texture2DMS
#endif
layout(push_constant) uniform PushConstants {
// Robust access.
ivec2 srcExtent;
// Translation from source to destination coordinates.
ivec2 srcOffset;
ivec2 destOffset;
int srcLayer;
int samples;
float invSamples;
// Mask to output only to attachments that are actually present.
int outputMask;
// Flip control.
bool flipX;
bool flipY;
} params;
layout(set = 0, binding = 0) uniform SRC_RESOURCE(SRC_RESOURCE_NAME) src;
layout(location = 0) out Type colorOut0;
layout(location = 1) out Type colorOut1;
layout(location = 2) out Type colorOut2;
layout(location = 3) out Type colorOut3;
layout(location = 4) out Type colorOut4;
layout(location = 5) out Type colorOut5;
layout(location = 6) out Type colorOut6;
layout(location = 7) out Type colorOut7;
void main()
{
ivec2 destSubImageCoords = ivec2(gl_FragCoord.xy) - params.destOffset;
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;
Type srcValue;
if (any(lessThan(srcImageCoords, ivec2(0))) ||
any(lessThanEqual(params.srcExtent, srcImageCoords)))
{
srcValue = Type(0, 0, 0, 1);
}
else
{
srcValue = Type(0, 0, 0, 0);
for (int i = 0; i < params.samples; ++i)
{
#if SrcIsArray
srcValue += texelFetch(src, ivec3(srcImageCoords, params.srcLayer), i);
#else
srcValue += texelFetch(src, srcImageCoords, i);
#endif
}
#if IsFloat
srcValue *= params.invSamples;
#else
srcValue = Type(round(srcValue * params.invSamples));
#endif
}
// Note: not exporting to render targets that are not present optimizes the number of export
// instructions, which would have otherwise been a likely bottleneck.
if ((params.outputMask & (1 << 0)) != 0)
{
colorOut0 = srcValue;
}
if ((params.outputMask & (1 << 1)) != 0)
{
colorOut1 = srcValue;
}
if ((params.outputMask & (1 << 2)) != 0)
{
colorOut2 = srcValue;
}
if ((params.outputMask & (1 << 3)) != 0)
{
colorOut3 = srcValue;
}
if ((params.outputMask & (1 << 4)) != 0)
{
colorOut4 = srcValue;
}
if ((params.outputMask & (1 << 5)) != 0)
{
colorOut5 = srcValue;
}
if ((params.outputMask & (1 << 6)) != 0)
{
colorOut6 = srcValue;
}
if ((params.outputMask & (1 << 7)) != 0)
{
colorOut7 = srcValue;
}
}
{
"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.",
"",
"ResolveColor.frag.json: Build parameters for ResolveColor.frag."
],
"Flags": [
"SrcIsArray"
],
"Format": [
"IsFloat",
"IsInt",
"IsUint"
]
}
//
// 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.
//
// ResolveDepthStencil.frag: Resolve multisampled depth/stencil images.
#version 450 core
#extension GL_EXT_samplerless_texture_functions : require
#extension GL_ARB_shader_stencil_export : require
#define MAKE_SRC_RESOURCE(prefix, type) prefix ## type
#define DEPTH_SRC_RESOURCE(type) 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
#if ResolveDepth
#define IsResolveDepth 1
#elif ResolveStencil
#define IsResolveStencil 1
#elif ResolveDepthStencil
#define IsResolveDepth 1
#define IsResolveStencil 1
#else
#error "Not all resolve targets are accounted for"
#endif
layout(push_constant) uniform PushConstants {
// Robust access.
ivec2 srcExtent;
// Translation from source to destination coordinates.
ivec2 srcOffset;
ivec2 destOffset;
int srcLayer;
// Flip control.
bool flipX;
bool flipY;
} params;
#if IsResolveDepth
layout(set = 0, binding = 0) uniform DEPTH_SRC_RESOURCE(SRC_RESOURCE_NAME) depth;
#endif
#if IsResolveStencil
layout(set = 0, binding = 1) uniform STENCIL_SRC_RESOURCE(SRC_RESOURCE_NAME) stencil;
#endif
void main()
{
ivec2 destSubImageCoords = ivec2(gl_FragCoord.xy) - params.destOffset;
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;
float depthValue;
uint stencilValue;
if (any(lessThan(srcImageCoords, ivec2(0))) ||
any(lessThanEqual(params.srcExtent, srcImageCoords)))
{
depthValue = 0;
stencilValue = 0;
}
else
{
// Note: always resolve using sample 0. GLES3 gives us freedom in choosing how to resolve
// depth/stencil images.
#if IsResolveDepth
#if SrcIsArray
depthValue = texelFetch(depth, ivec3(srcImageCoords, params.srcLayer), 0).x;
#else
depthValue = texelFetch(depth, srcImageCoords, 0).x;
#endif
#endif
#if IsResolveStencil
#if SrcIsArray
stencilValue = texelFetch(stencil, ivec3(srcImageCoords, params.srcLayer), 0).x;
#else
stencilValue = texelFetch(stencil, srcImageCoords, 0).x;
#endif
#endif
}
#if IsResolveDepth
gl_FragDepth = depthValue;
#endif
#if IsResolveStencil
gl_FragStencilRefARB = int(stencilValue);
#endif
}
{
"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.",
"",
"ResolveDepthStencil.frag.json: Build parameters for ResolveDepthStencil.frag."
],
"Flags": [
"SrcIsArray"
],
"Resolve": [
"ResolveDepth",
"ResolveStencil",
"ResolveDepthStencil"
]
}
...@@ -1356,8 +1356,8 @@ void DescriptorSetLayoutDesc::unpackBindings(DescriptorSetLayoutBindingVector *b ...@@ -1356,8 +1356,8 @@ void DescriptorSetLayoutDesc::unpackBindings(DescriptorSetLayoutBindingVector *b
binding.binding = bindingIndex; binding.binding = bindingIndex;
binding.descriptorCount = packedBinding.count; binding.descriptorCount = packedBinding.count;
binding.descriptorType = static_cast<VkDescriptorType>(packedBinding.type); binding.descriptorType = static_cast<VkDescriptorType>(packedBinding.type);
binding.stageFlags = static_cast<VkShaderStageFlags>(packedBinding.stages); binding.stageFlags = static_cast<VkShaderStageFlags>(packedBinding.stages);
binding.pImmutableSamplers = nullptr; binding.pImmutableSamplers = nullptr;
bindings->push_back(binding); bindings->push_back(binding);
} }
...@@ -1454,7 +1454,9 @@ angle::Result RenderPassCache::addRenderPass(vk::Context *context, ...@@ -1454,7 +1454,9 @@ angle::Result RenderPassCache::addRenderPass(vk::Context *context,
const vk::RenderPassDesc &desc, const vk::RenderPassDesc &desc,
vk::RenderPass **renderPassOut) vk::RenderPass **renderPassOut)
{ {
// Insert some dummy attachment ops. // Insert some dummy attachment ops. Note that render passes with different ops are still
// compatible.
//
// It would be nice to pre-populate the cache in the Renderer so we rarely miss here. // It would be nice to pre-populate the cache in the Renderer so we rarely miss here.
vk::AttachmentOpsArray ops; vk::AttachmentOpsArray ops;
......
...@@ -46,6 +46,7 @@ void RendererVk::ensureCapsInitialized() const ...@@ -46,6 +46,7 @@ void RendererVk::ensureCapsInitialized() const
mNativeExtensions.drawBuffers = true; mNativeExtensions.drawBuffers = true;
mNativeExtensions.fragDepth = true; mNativeExtensions.fragDepth = true;
mNativeExtensions.framebufferBlit = true; mNativeExtensions.framebufferBlit = true;
mNativeExtensions.framebufferMultisample = true;
mNativeExtensions.copyTexture = true; mNativeExtensions.copyTexture = true;
mNativeExtensions.copyCompressedTexture = true; mNativeExtensions.copyCompressedTexture = true;
mNativeExtensions.debugMarker = true; mNativeExtensions.debugMarker = true;
...@@ -229,6 +230,13 @@ void RendererVk::ensureCapsInitialized() const ...@@ -229,6 +230,13 @@ void RendererVk::ensureCapsInitialized() const
(mPhysicalDeviceProperties.limits.maxVertexOutputComponents / 4) - kReservedVaryingCount; (mPhysicalDeviceProperties.limits.maxVertexOutputComponents / 4) - kReservedVaryingCount;
mNativeCaps.maxVertexOutputComponents = mNativeCaps.maxVaryingVectors * 4; mNativeCaps.maxVertexOutputComponents = mNativeCaps.maxVaryingVectors * 4;
const VkPhysicalDeviceLimits &limits = mPhysicalDeviceProperties.limits;
const uint32_t sampleCounts = limits.framebufferColorSampleCounts &
limits.framebufferDepthSampleCounts &
limits.framebufferStencilSampleCounts;
mNativeCaps.maxSamples = vk_gl::GetMaxSampleCount(sampleCounts);
mNativeCaps.subPixelBits = mPhysicalDeviceProperties.limits.subPixelPrecisionBits; mNativeCaps.subPixelBits = mPhysicalDeviceProperties.limits.subPixelPrecisionBits;
} }
......
...@@ -87,6 +87,18 @@ namespace ...@@ -87,6 +87,18 @@ namespace
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000013.inc" #include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000013.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000014.inc" #include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000014.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000015.inc" #include "libANGLE/renderer/vulkan/shaders/gen/ImageCopy.frag.00000015.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ResolveColor.frag.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ResolveColor.frag.00000001.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ResolveColor.frag.00000002.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ResolveColor.frag.00000003.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ResolveColor.frag.00000004.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ResolveColor.frag.00000005.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ResolveDepthStencil.frag.00000000.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ResolveDepthStencil.frag.00000001.inc"
#include "libANGLE/renderer/vulkan/shaders/gen/ResolveDepthStencil.frag.00000002.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.00000005.inc"
// This is SPIR-V binary blob and the size. // This is SPIR-V binary blob and the size.
struct ShaderBlob struct ShaderBlob
...@@ -180,6 +192,22 @@ constexpr ShaderBlob kImageCopy_frag_shaders[] = { ...@@ -180,6 +192,22 @@ constexpr ShaderBlob kImageCopy_frag_shaders[] = {
{kImageCopy_frag_00000014, sizeof(kImageCopy_frag_00000014)}, {kImageCopy_frag_00000014, sizeof(kImageCopy_frag_00000014)},
{kImageCopy_frag_00000015, sizeof(kImageCopy_frag_00000015)}, {kImageCopy_frag_00000015, sizeof(kImageCopy_frag_00000015)},
}; };
constexpr ShaderBlob kResolveColor_frag_shaders[] = {
{kResolveColor_frag_00000000, sizeof(kResolveColor_frag_00000000)},
{kResolveColor_frag_00000001, sizeof(kResolveColor_frag_00000001)},
{kResolveColor_frag_00000002, sizeof(kResolveColor_frag_00000002)},
{kResolveColor_frag_00000003, sizeof(kResolveColor_frag_00000003)},
{kResolveColor_frag_00000004, sizeof(kResolveColor_frag_00000004)},
{kResolveColor_frag_00000005, sizeof(kResolveColor_frag_00000005)},
};
constexpr ShaderBlob kResolveDepthStencil_frag_shaders[] = {
{kResolveDepthStencil_frag_00000000, sizeof(kResolveDepthStencil_frag_00000000)},
{kResolveDepthStencil_frag_00000001, sizeof(kResolveDepthStencil_frag_00000001)},
{kResolveDepthStencil_frag_00000002, sizeof(kResolveDepthStencil_frag_00000002)},
{kResolveDepthStencil_frag_00000003, sizeof(kResolveDepthStencil_frag_00000003)},
{kResolveDepthStencil_frag_00000004, sizeof(kResolveDepthStencil_frag_00000004)},
{kResolveDepthStencil_frag_00000005, sizeof(kResolveDepthStencil_frag_00000005)},
};
angle::Result GetShader(Context *context, angle::Result GetShader(Context *context,
RefCounted<ShaderAndSerial> *shaders, RefCounted<ShaderAndSerial> *shaders,
...@@ -231,6 +259,14 @@ void ShaderLibrary::destroy(VkDevice device) ...@@ -231,6 +259,14 @@ void ShaderLibrary::destroy(VkDevice device)
{ {
shader.get().destroy(device); shader.get().destroy(device);
} }
for (RefCounted<ShaderAndSerial> &shader : mResolveColor_frag_shaders)
{
shader.get().destroy(device);
}
for (RefCounted<ShaderAndSerial> &shader : mResolveDepthStencil_frag_shaders)
{
shader.get().destroy(device);
}
} }
angle::Result ShaderLibrary::getBufferUtils_comp(Context *context, angle::Result ShaderLibrary::getBufferUtils_comp(Context *context,
...@@ -273,5 +309,21 @@ angle::Result ShaderLibrary::getImageCopy_frag(Context *context, ...@@ -273,5 +309,21 @@ angle::Result ShaderLibrary::getImageCopy_frag(Context *context,
ArraySize(kImageCopy_frag_shaders), shaderFlags, shaderOut); ArraySize(kImageCopy_frag_shaders), shaderFlags, shaderOut);
} }
angle::Result ShaderLibrary::getResolveColor_frag(Context *context,
uint32_t shaderFlags,
RefCounted<ShaderAndSerial> **shaderOut)
{
return GetShader(context, mResolveColor_frag_shaders, kResolveColor_frag_shaders,
ArraySize(kResolveColor_frag_shaders), shaderFlags, shaderOut);
}
angle::Result ShaderLibrary::getResolveDepthStencil_frag(Context *context,
uint32_t shaderFlags,
RefCounted<ShaderAndSerial> **shaderOut)
{
return GetShader(context, mResolveDepthStencil_frag_shaders, kResolveDepthStencil_frag_shaders,
ArraySize(kResolveDepthStencil_frag_shaders), shaderFlags, shaderOut);
}
} // namespace vk } // namespace vk
} // namespace rx } // namespace rx
...@@ -80,4 +80,16 @@ angle_vulkan_internal_shaders = [ ...@@ -80,4 +80,16 @@ angle_vulkan_internal_shaders = [
"shaders/gen/ImageCopy.frag.00000013.inc", "shaders/gen/ImageCopy.frag.00000013.inc",
"shaders/gen/ImageCopy.frag.00000014.inc", "shaders/gen/ImageCopy.frag.00000014.inc",
"shaders/gen/ImageCopy.frag.00000015.inc", "shaders/gen/ImageCopy.frag.00000015.inc",
"shaders/gen/ResolveColor.frag.00000000.inc",
"shaders/gen/ResolveColor.frag.00000001.inc",
"shaders/gen/ResolveColor.frag.00000002.inc",
"shaders/gen/ResolveColor.frag.00000003.inc",
"shaders/gen/ResolveColor.frag.00000004.inc",
"shaders/gen/ResolveColor.frag.00000005.inc",
"shaders/gen/ResolveDepthStencil.frag.00000000.inc",
"shaders/gen/ResolveDepthStencil.frag.00000001.inc",
"shaders/gen/ResolveDepthStencil.frag.00000002.inc",
"shaders/gen/ResolveDepthStencil.frag.00000003.inc",
"shaders/gen/ResolveDepthStencil.frag.00000004.inc",
"shaders/gen/ResolveDepthStencil.frag.00000005.inc",
] ]
...@@ -111,6 +111,38 @@ enum DestFormat ...@@ -111,6 +111,38 @@ enum DestFormat
}; };
} // namespace ImageCopy_frag } // namespace ImageCopy_frag
namespace ResolveColor_frag
{
enum flags
{
kSrcIsArray = 0x00000001,
kFlagsMask = 0x00000001,
};
enum Format
{
kIsFloat = 0x00000000,
kIsInt = 0x00000002,
kIsUint = 0x00000004,
kFormatMask = 0x00000006,
};
} // namespace ResolveColor_frag
namespace ResolveDepthStencil_frag
{
enum flags
{
kSrcIsArray = 0x00000001,
kFlagsMask = 0x00000001,
};
enum Resolve
{
kResolveDepth = 0x00000000,
kResolveStencil = 0x00000002,
kResolveDepthStencil = 0x00000004,
kResolveMask = 0x00000006,
};
} // namespace ResolveDepthStencil_frag
} // namespace InternalShader } // namespace InternalShader
class ShaderLibrary final : angle::NonCopyable class ShaderLibrary final : angle::NonCopyable
...@@ -136,6 +168,12 @@ class ShaderLibrary final : angle::NonCopyable ...@@ -136,6 +168,12 @@ class ShaderLibrary final : angle::NonCopyable
angle::Result getImageCopy_frag(Context *context, angle::Result getImageCopy_frag(Context *context,
uint32_t shaderFlags, uint32_t shaderFlags,
RefCounted<ShaderAndSerial> **shaderOut); RefCounted<ShaderAndSerial> **shaderOut);
angle::Result getResolveColor_frag(Context *context,
uint32_t shaderFlags,
RefCounted<ShaderAndSerial> **shaderOut);
angle::Result getResolveDepthStencil_frag(Context *context,
uint32_t shaderFlags,
RefCounted<ShaderAndSerial> **shaderOut);
private: private:
RefCounted<ShaderAndSerial> RefCounted<ShaderAndSerial>
...@@ -153,6 +191,12 @@ class ShaderLibrary final : angle::NonCopyable ...@@ -153,6 +191,12 @@ class ShaderLibrary final : angle::NonCopyable
mImageCopy_frag_shaders[InternalShader::ImageCopy_frag::kFlagsMask | mImageCopy_frag_shaders[InternalShader::ImageCopy_frag::kFlagsMask |
InternalShader::ImageCopy_frag::kSrcFormatMask | InternalShader::ImageCopy_frag::kSrcFormatMask |
InternalShader::ImageCopy_frag::kDestFormatMask]; InternalShader::ImageCopy_frag::kDestFormatMask];
RefCounted<ShaderAndSerial>
mResolveColor_frag_shaders[InternalShader::ResolveColor_frag::kFlagsMask |
InternalShader::ResolveColor_frag::kFormatMask];
RefCounted<ShaderAndSerial>
mResolveDepthStencil_frag_shaders[InternalShader::ResolveDepthStencil_frag::kFlagsMask |
InternalShader::ResolveDepthStencil_frag::kResolveMask];
}; };
} // namespace vk } // namespace vk
} // namespace rx } // namespace rx
......
...@@ -415,6 +415,32 @@ angle::Result InitShaderAndSerial(Context *context, ...@@ -415,6 +415,32 @@ angle::Result InitShaderAndSerial(Context *context,
return angle::Result::Continue; return angle::Result::Continue;
} }
gl::TextureType Get2DTextureType(uint32_t layerCount, GLint samples)
{
if (layerCount > 1)
{
if (samples > 1)
{
return gl::TextureType::_2DMultisampleArray;
}
else
{
return gl::TextureType::_2DArray;
}
}
else
{
if (samples > 1)
{
return gl::TextureType::_2DMultisample;
}
else
{
return gl::TextureType::_2D;
}
}
}
GarbageObjectBase::GarbageObjectBase() : mHandleType(HandleType::Invalid), mHandle(VK_NULL_HANDLE) GarbageObjectBase::GarbageObjectBase() : mHandleType(HandleType::Invalid), mHandle(VK_NULL_HANDLE)
{} {}
...@@ -845,5 +871,30 @@ void AddSampleCounts(VkSampleCountFlags sampleCounts, gl::SupportedSampleSet *se ...@@ -845,5 +871,30 @@ void AddSampleCounts(VkSampleCountFlags sampleCounts, gl::SupportedSampleSet *se
setOut->insert(1 << bit); setOut->insert(1 << bit);
} }
} }
GLuint GetMaxSampleCount(VkSampleCountFlags sampleCounts)
{
GLuint maxCount = 0;
for (unsigned long bit : angle::BitSet32<32>(sampleCounts))
{
maxCount = 1 << bit;
}
return maxCount;
}
GLuint GetSampleCount(VkSampleCountFlags supportedCounts, GLuint requestedCount)
{
for (unsigned long bit : angle::BitSet32<32>(supportedCounts))
{
GLuint sampleCount = 1 << bit;
if (sampleCount >= requestedCount)
{
return sampleCount;
}
}
UNREACHABLE();
return 0;
}
} // namespace vk_gl } // namespace vk_gl
} // namespace rx } // namespace rx
...@@ -303,6 +303,8 @@ angle::Result InitShaderAndSerial(Context *context, ...@@ -303,6 +303,8 @@ angle::Result InitShaderAndSerial(Context *context,
const uint32_t *shaderCode, const uint32_t *shaderCode,
size_t shaderCodeSize); size_t shaderCodeSize);
gl::TextureType Get2DTextureType(uint32_t layerCount, GLint samples);
enum class RecordingMode enum class RecordingMode
{ {
Start, Start,
...@@ -553,6 +555,10 @@ namespace vk_gl ...@@ -553,6 +555,10 @@ namespace vk_gl
{ {
// Find set bits in sampleCounts and add the corresponding sample count to the set. // Find set bits in sampleCounts and add the corresponding sample count to the set.
void AddSampleCounts(VkSampleCountFlags sampleCounts, gl::SupportedSampleSet *outSet); void AddSampleCounts(VkSampleCountFlags sampleCounts, gl::SupportedSampleSet *outSet);
// Return the maximum sample count with a bit set in |sampleCounts|.
GLuint GetMaxSampleCount(VkSampleCountFlags sampleCounts);
// Return a supported sample count that's at least as large as the requested one.
GLuint GetSampleCount(VkSampleCountFlags supportedCounts, GLuint requestedCount);
} // namespace vk_gl } // namespace vk_gl
} // namespace rx } // namespace rx
......
...@@ -545,22 +545,32 @@ ...@@ -545,22 +545,32 @@
3189 VULKAN : dEQP-GLES3.functional.shaders.texture_functions.* = SKIP 3189 VULKAN : dEQP-GLES3.functional.shaders.texture_functions.* = SKIP
// Multisampling: // Multisampling:
3204 VULKAN : dEQP-GLES3.functional.fbo.completeness.samples.* = SKIP 3200 VULKAN : dEQP-GLES3.functional.fbo.msaa.2_samples.depth32f_stencil8 = FAIL
3204 VULKAN : dEQP-GLES3.functional.fbo.msaa.* = SKIP 3200 VULKAN : dEQP-GLES3.functional.fbo.msaa.2_samples.depth24_stencil8 = FAIL
3204 VULKAN : dEQP-GLES3.functional.negative_api.buffer.read_pixels_fbo_format_mismatch = SKIP 3200 VULKAN : dEQP-GLES3.functional.fbo.msaa.2_samples.stencil_index8 = FAIL
3204 VULKAN : dEQP-GLES3.functional.negative_api.buffer.blit_framebuffer_multisample = SKIP 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
3204 VULKAN : dEQP-GLES3.functional.multisample.fbo* = SKIP 3204 VULKAN : dEQP-GLES3.functional.multisample.fbo_4_samples.sample_coverage_invert = FAIL
3204 VULKAN : dEQP-GLES3.functional.state_query.rbo.renderbuffer_samples = SKIP 3204 VULKAN : dEQP-GLES3.functional.multisample.fbo_4_samples.proportionality_sample_coverage = FAIL
3204 VULKAN : dEQP-GLES3.functional.fragment_out.* = SKIP 3204 VULKAN : dEQP-GLES3.functional.multisample.fbo_4_samples.proportionality_sample_coverage_inverted = FAIL
3204 VULKAN : dEQP-GLES3.functional.rasterization.fbo.rbo_multisample* = SKIP 3204 VULKAN : dEQP-GLES3.functional.multisample.fbo_8_samples.sample_coverage_invert = FAIL
3204 VULKAN : dEQP-GLES3.functional.shaders.derivate.* = SKIP 3204 VULKAN : dEQP-GLES3.functional.multisample.fbo_8_samples.proportionality_sample_coverage = FAIL
3204 VULKAN : dEQP-GLES3.functional.multisample.fbo_8_samples.proportionality_sample_coverage_inverted = FAIL
3204 VULKAN : dEQP-GLES3.functional.multisample.fbo_max_samples.sample_coverage_invert = FAIL
3204 VULKAN : dEQP-GLES3.functional.multisample.fbo_max_samples.proportionality_sample_coverage = FAIL
3204 VULKAN : dEQP-GLES3.functional.multisample.fbo_max_samples.proportionality_sample_coverage_inverted = FAIL
// Formats: // Formats:
2950 VULKAN : dEQP-GLES3.functional.fbo.completeness.renderable.renderbuffer.color0.rgba32f = FAIL 2950 VULKAN : dEQP-GLES3.functional.fbo.completeness.renderable.renderbuffer.color0.rgba32f = FAIL
2950 VULKAN : dEQP-GLES3.functional.fbo.completeness.renderable.texture.color0.rgba32f = FAIL 2950 VULKAN : dEQP-GLES3.functional.fbo.completeness.renderable.texture.color0.rgba32f = FAIL
2950 VULKAN : dEQP-GLES3.functional.fragment_out.* = SKIP
// Depth/Stencil textures: // Depth/Stencil textures:
2905 VULKAN : dEQP-GLES3.functional.fbo.completeness.renderable.texture.depth.depth_component_unsigned_int = FAIL 2905 VULKAN : dEQP-GLES3.functional.fbo.completeness.renderable.texture.depth.depth_component_unsigned_int = FAIL
...@@ -599,6 +609,7 @@ ...@@ -599,6 +609,7 @@
3219 VULKAN : dEQP-GLES3.functional.negative_api.shader.link_program = FAIL 3219 VULKAN : dEQP-GLES3.functional.negative_api.shader.link_program = FAIL
3219 VULKAN : dEQP-GLES3.functional.negative_api.shader.use_program = FAIL 3219 VULKAN : dEQP-GLES3.functional.negative_api.shader.use_program = FAIL
3443 VULKAN : dEQP-GLES3.functional.ubo.random.basic_arrays.10 = FAIL 3443 VULKAN : dEQP-GLES3.functional.ubo.random.basic_arrays.10 = FAIL
3487 VULKAN : dEQP-GLES3.functional.shaders.derivate.dfdy.* = FAIL
// New vertex attribute formats: // New vertex attribute formats:
3193 VULKAN : dEQP-GLES3.functional.vertex_arrays.single_attribute.strides.int2_10_10_10.* = SKIP 3193 VULKAN : dEQP-GLES3.functional.vertex_arrays.single_attribute.strides.int2_10_10_10.* = SKIP
...@@ -697,7 +708,7 @@ ...@@ -697,7 +708,7 @@
2672 VULKAN : dEQP-GLES3.functional.draw.draw_elements_instanced.line_loop.* = SKIP 2672 VULKAN : dEQP-GLES3.functional.draw.draw_elements_instanced.line_loop.* = SKIP
2672 VULKAN : dEQP-GLES3.functional.draw.random.* = SKIP 2672 VULKAN : dEQP-GLES3.functional.draw.random.* = SKIP
// Failures on newer NVIDIA drivers (411.95) and passes on older drivers (388.16). // Failures on newer NVIDIA drivers (411.95) and passes on older drivers (388.16). Passes on 418.12 on Linux.
2976 VULKAN NVIDIA : dEQP-GLES3.functional.shaders.invariance.* = FAIL 2976 VULKAN NVIDIA : dEQP-GLES3.functional.shaders.invariance.* = FAIL
// To be triaged: // To be triaged:
......
...@@ -1164,16 +1164,6 @@ TEST_P(BlitFramebufferTest, MultisampleDepth) ...@@ -1164,16 +1164,6 @@ TEST_P(BlitFramebufferTest, MultisampleDepth)
glBindRenderbuffer(GL_RENDERBUFFER, renderbuf.get()); glBindRenderbuffer(GL_RENDERBUFFER, renderbuf.get());
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_DEPTH_COMPONENT24, 256, 256); glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_DEPTH_COMPONENT24, 256, 256);
constexpr char kFS[] =
"#version 300 es\n"
"out mediump vec4 red;\n"
"void main() {\n"
" red = vec4(1.0, 0.0, 0.0, 1.0);\n"
" gl_FragDepth = 0.5;\n"
"}";
ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), kFS);
GLFramebuffer framebuffer; GLFramebuffer framebuffer;
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get()); glBindFramebuffer(GL_FRAMEBUFFER, framebuffer.get());
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER,
...@@ -1210,11 +1200,83 @@ TEST_P(BlitFramebufferTest, MultisampleDepth) ...@@ -1210,11 +1200,83 @@ TEST_P(BlitFramebufferTest, MultisampleDepth)
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green); EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
// Draw with 0.5f test and the test should pass. // Make sure resulting depth is near 0.5f.
ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
glEnable(GL_DEPTH_TEST);
glDepthMask(false);
glDepthFunc(GL_LESS);
drawQuad(drawRed.get(), essl3_shaders::PositionAttrib(), -0.01f);
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
EXPECT_PIXEL_COLOR_EQ(255, 0, GLColor::red);
EXPECT_PIXEL_COLOR_EQ(0, 255, GLColor::red);
EXPECT_PIXEL_COLOR_EQ(255, 255, GLColor::red);
EXPECT_PIXEL_COLOR_EQ(127, 127, GLColor::red);
ANGLE_GL_PROGRAM(drawBlue, essl3_shaders::vs::Simple(), essl3_shaders::fs::Blue());
glEnable(GL_DEPTH_TEST);
glDepthMask(false);
glDepthFunc(GL_GREATER);
drawQuad(drawBlue.get(), essl3_shaders::PositionAttrib(), 0.01f);
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::blue);
EXPECT_PIXEL_COLOR_EQ(255, 0, GLColor::blue);
EXPECT_PIXEL_COLOR_EQ(0, 255, GLColor::blue);
EXPECT_PIXEL_COLOR_EQ(255, 255, GLColor::blue);
EXPECT_PIXEL_COLOR_EQ(127, 127, GLColor::blue);
ASSERT_GL_NO_ERROR();
}
// Tests clearing a multisampled depth buffer.
TEST_P(BlitFramebufferTest, MultisampleDepthClear)
{
GLRenderbuffer depthMS;
glBindRenderbuffer(GL_RENDERBUFFER, depthMS.get());
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_DEPTH_COMPONENT24, 256, 256);
GLRenderbuffer colorMS;
glBindRenderbuffer(GL_RENDERBUFFER, colorMS.get());
glRenderbufferStorageMultisample(GL_RENDERBUFFER, 2, GL_RGBA8, 256, 256);
GLRenderbuffer colorResolved;
glBindRenderbuffer(GL_RENDERBUFFER, colorResolved.get());
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 256, 256);
GLFramebuffer framebufferMS;
glBindFramebuffer(GL_FRAMEBUFFER, framebufferMS.get());
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthMS.get());
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, colorMS.get());
// Clear depth buffer to 0.5 and color to green.
glClearDepthf(0.5f);
glClearColor(0.0f, 1.0f, 0.0f, 1.0f);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glFlush();
// Draw red into the multisampled color buffer.
ANGLE_GL_PROGRAM(drawRed, essl3_shaders::vs::Simple(), essl3_shaders::fs::Red());
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_EQUAL); glDepthFunc(GL_EQUAL);
drawQuad(drawRed.get(), essl3_shaders::PositionAttrib(), 0.5f); drawQuad(drawRed.get(), essl3_shaders::PositionAttrib(), 0.0f);
// Resolve the color buffer to make sure the above draw worked correctly, which in turn implies
// that the multisampled depth clear worked.
GLFramebuffer framebufferResolved;
glBindFramebuffer(GL_FRAMEBUFFER, framebufferResolved.get());
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER,
colorResolved.get());
glBindFramebuffer(GL_READ_FRAMEBUFFER, framebufferMS.get());
glBlitFramebuffer(0, 0, 256, 256, 0, 0, 256, 256, GL_COLOR_BUFFER_BIT, GL_NEAREST);
glBindFramebuffer(GL_FRAMEBUFFER, framebufferResolved.get());
ASSERT_GL_NO_ERROR();
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red); EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
EXPECT_PIXEL_COLOR_EQ(255, 0, GLColor::red);
EXPECT_PIXEL_COLOR_EQ(0, 255, GLColor::red);
EXPECT_PIXEL_COLOR_EQ(255, 255, GLColor::red);
EXPECT_PIXEL_COLOR_EQ(127, 127, GLColor::red);
ASSERT_GL_NO_ERROR(); ASSERT_GL_NO_ERROR();
} }
...@@ -1225,6 +1287,10 @@ TEST_P(BlitFramebufferTest, MultisampleStencil) ...@@ -1225,6 +1287,10 @@ 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);
...@@ -1282,6 +1348,9 @@ TEST_P(BlitFramebufferTest, MultisampleStencil) ...@@ -1282,6 +1348,9 @@ TEST_P(BlitFramebufferTest, MultisampleStencil)
// Blit an SRGB framebuffer and scale it. // Blit an SRGB framebuffer and scale it.
TEST_P(BlitFramebufferTest, BlitSRGBToRGBAndScale) TEST_P(BlitFramebufferTest, BlitSRGBToRGBAndScale)
{ {
// TODO(syoussefi): Vulkan does not implement stretching yet. http://anglebug.com/3200
ANGLE_SKIP_TEST_IF(IsVulkan());
constexpr const GLsizei kWidth = 256; constexpr const GLsizei kWidth = 256;
constexpr const GLsizei kHeight = 256; constexpr const GLsizei kHeight = 256;
...@@ -1393,6 +1462,9 @@ TEST_P(BlitFramebufferTest, PartialBlitSRGBToRGB) ...@@ -1393,6 +1462,9 @@ TEST_P(BlitFramebufferTest, PartialBlitSRGBToRGB)
// clipped out). // clipped out).
TEST_P(BlitFramebufferTest, BlitSRGBToRGBOversizedSourceArea) TEST_P(BlitFramebufferTest, BlitSRGBToRGBOversizedSourceArea)
{ {
// TODO(syoussefi): Vulkan does not implement stretching yet. http://anglebug.com/3200
ANGLE_SKIP_TEST_IF(IsVulkan());
constexpr const GLsizei kWidth = 256; constexpr const GLsizei kWidth = 256;
constexpr const GLsizei kHeight = 256; constexpr const GLsizei kHeight = 256;
...@@ -1497,6 +1569,7 @@ ANGLE_INSTANTIATE_TEST(BlitFramebufferANGLETest, ...@@ -1497,6 +1569,7 @@ ANGLE_INSTANTIATE_TEST(BlitFramebufferANGLETest,
ES2_D3D11_PRESENT_PATH_FAST(), ES2_D3D11_PRESENT_PATH_FAST(),
ES2_OPENGL(), ES2_OPENGL(),
ES3_OPENGL(), ES3_OPENGL(),
ES2_VULKAN()); ES2_VULKAN(),
ES3_VULKAN());
ANGLE_INSTANTIATE_TEST(BlitFramebufferTest, ES3_D3D11(), ES3_OPENGL()); ANGLE_INSTANTIATE_TEST(BlitFramebufferTest, ES3_D3D11(), ES3_OPENGL(), ES3_VULKAN());
...@@ -1972,6 +1972,7 @@ ANGLE_INSTANTIATE_TEST(ImageTest, ...@@ -1972,6 +1972,7 @@ ANGLE_INSTANTIATE_TEST(ImageTest,
ES3_OPENGL(), ES3_OPENGL(),
ES2_OPENGLES(), ES2_OPENGLES(),
ES3_OPENGLES(), ES3_OPENGLES(),
ES2_VULKAN()); ES2_VULKAN(),
ANGLE_INSTANTIATE_TEST(ImageTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); ES3_VULKAN());
ANGLE_INSTANTIATE_TEST(ImageTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES(), ES3_VULKAN());
} // namespace angle } // namespace angle
...@@ -405,4 +405,5 @@ ANGLE_INSTANTIATE_TEST(MultisampleCompatibilityTest, ...@@ -405,4 +405,5 @@ ANGLE_INSTANTIATE_TEST(MultisampleCompatibilityTest,
ES3_D3D11(), ES3_D3D11(),
ES3_OPENGL(), ES3_OPENGL(),
ES3_OPENGLES(), ES3_OPENGLES(),
ES2_VULKAN()); ES2_VULKAN(),
ES3_VULKAN());
...@@ -698,6 +698,14 @@ TEST_P(ReadPixelsErrorTest, ReadBufferIsNone) ...@@ -698,6 +698,14 @@ TEST_P(ReadPixelsErrorTest, ReadBufferIsNone)
ANGLE_INSTANTIATE_TEST(ReadPixelsTest, ES2_D3D11(), ES2_OPENGL(), ES2_OPENGLES(), ES2_VULKAN()); ANGLE_INSTANTIATE_TEST(ReadPixelsTest, ES2_D3D11(), ES2_OPENGL(), ES2_OPENGLES(), ES2_VULKAN());
ANGLE_INSTANTIATE_TEST(ReadPixelsPBOTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); ANGLE_INSTANTIATE_TEST(ReadPixelsPBOTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
ANGLE_INSTANTIATE_TEST(ReadPixelsPBODrawTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); ANGLE_INSTANTIATE_TEST(ReadPixelsPBODrawTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
ANGLE_INSTANTIATE_TEST(ReadPixelsMultisampleTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); ANGLE_INSTANTIATE_TEST(ReadPixelsMultisampleTest,
ES3_D3D11(),
ES3_OPENGL(),
ES3_OPENGLES(),
ES3_VULKAN());
ANGLE_INSTANTIATE_TEST(ReadPixelsTextureTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); ANGLE_INSTANTIATE_TEST(ReadPixelsTextureTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
ANGLE_INSTANTIATE_TEST(ReadPixelsErrorTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES()); ANGLE_INSTANTIATE_TEST(ReadPixelsErrorTest,
ES3_D3D11(),
ES3_OPENGL(),
ES3_OPENGLES(),
ES3_VULKAN());
...@@ -450,6 +450,30 @@ void main() ...@@ -450,6 +450,30 @@ void main()
})"; })";
} }
// A shader that fills with 100% opaque green.
const char *Green()
{
return R"(#version 300 es
precision highp float;
out vec4 my_FragColor;
void main()
{
my_FragColor = vec4(0.0, 1.0, 0.0, 1.0);
})";
}
// A shader that fills with 100% opaque blue.
const char *Blue()
{
return R"(#version 300 es
precision highp float;
out vec4 my_FragColor;
void main()
{
my_FragColor = vec4(0.0, 0.0, 1.0, 1.0);
})";
}
} // namespace fs } // namespace fs
} // namespace essl3_shaders } // namespace essl3_shaders
......
...@@ -116,6 +116,12 @@ namespace fs ...@@ -116,6 +116,12 @@ namespace fs
// A shader that fills with 100% opaque red. // A shader that fills with 100% opaque red.
ANGLE_UTIL_EXPORT const char *Red(); ANGLE_UTIL_EXPORT const char *Red();
// A shader that fills with 100% opaque green.
ANGLE_UTIL_EXPORT const char *Green();
// A shader that fills with 100% opaque blue.
ANGLE_UTIL_EXPORT const char *Blue();
} // namespace fs } // namespace fs
} // namespace essl3_shaders } // namespace essl3_shaders
......
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