Commit 9f5eb0b8 by Mohan Maiya Committed by Commit Bot

Vulkan: Add OES_sample_shading extension support

Support OES_sample_shading extension if the underlying Vulkan ICD supports sampleRateShading. Bug: angleproject:3587 Tests: dEQP-GLES31.functional.sample_shading.* Change-Id: I1b324c1ad3ea3b2157d3cbe0abcdf7085aa4231b Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2444213 Commit-Queue: Mohan Maiya <m.maiya@samsung.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org>
parent 974c2371
...@@ -1032,6 +1032,7 @@ const ExtensionInfoMap &GetExtensionInfoMap() ...@@ -1032,6 +1032,7 @@ const ExtensionInfoMap &GetExtensionInfoMap()
map["GL_EXT_EGL_image_array"] = enableableExtension(&Extensions::eglImageArray); map["GL_EXT_EGL_image_array"] = enableableExtension(&Extensions::eglImageArray);
map["GL_EXT_buffer_storage"] = enableableExtension(&Extensions::bufferStorageEXT); map["GL_EXT_buffer_storage"] = enableableExtension(&Extensions::bufferStorageEXT);
map["GL_OES_texture_stencil8"] = enableableExtension(&Extensions::stencilIndex8); map["GL_OES_texture_stencil8"] = enableableExtension(&Extensions::stencilIndex8);
map["GL_OES_sample_shading"] = enableableExtension(&Extensions::sampleShadingOES);
// GLES1 extensions // GLES1 extensions
map["GL_OES_point_size_array"] = enableableExtension(&Extensions::pointSizeArrayOES); map["GL_OES_point_size_array"] = enableableExtension(&Extensions::pointSizeArrayOES);
map["GL_OES_texture_cube_map"] = enableableExtension(&Extensions::textureCubeMapOES); map["GL_OES_texture_cube_map"] = enableableExtension(&Extensions::textureCubeMapOES);
......
...@@ -650,6 +650,9 @@ struct Extensions ...@@ -650,6 +650,9 @@ struct Extensions
// GL_OES_texture_stencil8 // GL_OES_texture_stencil8
bool stencilIndex8 = false; bool stencilIndex8 = false;
// GL_OES_sample_shading
bool sampleShadingOES = false;
}; };
// Pointer to a boolean memeber of the Extensions struct // Pointer to a boolean memeber of the Extensions struct
......
...@@ -7260,7 +7260,7 @@ void Context::deleteSamplers(GLsizei count, const SamplerID *samplers) ...@@ -7260,7 +7260,7 @@ void Context::deleteSamplers(GLsizei count, const SamplerID *samplers)
void Context::minSampleShading(GLfloat value) void Context::minSampleShading(GLfloat value)
{ {
UNIMPLEMENTED(); mState.setMinSampleShading(value);
} }
void Context::getInternalformativ(GLenum target, void Context::getInternalformativ(GLenum target,
......
...@@ -327,6 +327,8 @@ State::State(const State *shareContextState, ...@@ -327,6 +327,8 @@ State::State(const State *shareContextState,
mSampleCoverageInvert(false), mSampleCoverageInvert(false),
mSampleMask(false), mSampleMask(false),
mMaxSampleMaskWords(0), mMaxSampleMaskWords(0),
mIsSampleShadingEnabled(false),
mMinSampleShading(0.0f),
mStencilRef(0), mStencilRef(0),
mStencilBackRef(0), mStencilBackRef(0),
mLineWidth(0), mLineWidth(0),
...@@ -1071,6 +1073,24 @@ void State::setMultisampling(bool enabled) ...@@ -1071,6 +1073,24 @@ void State::setMultisampling(bool enabled)
mDirtyBits.set(DIRTY_BIT_MULTISAMPLING); mDirtyBits.set(DIRTY_BIT_MULTISAMPLING);
} }
void State::setSampleShading(bool enabled)
{
mIsSampleShadingEnabled = enabled;
mMinSampleShading = (enabled) ? 1.0f : mMinSampleShading;
mDirtyBits.set(DIRTY_BIT_SAMPLE_SHADING);
}
void State::setMinSampleShading(float value)
{
value = gl::clamp01(value);
if (mMinSampleShading != value)
{
mMinSampleShading = value;
mDirtyBits.set(DIRTY_BIT_SAMPLE_SHADING);
}
}
void State::setScissorTest(bool enabled) void State::setScissorTest(bool enabled)
{ {
if (mScissorTest != enabled) if (mScissorTest != enabled)
...@@ -1177,6 +1197,9 @@ void State::setEnableFeature(GLenum feature, bool enabled) ...@@ -1177,6 +1197,9 @@ void State::setEnableFeature(GLenum feature, bool enabled)
case GL_TEXTURE_RECTANGLE_ANGLE: case GL_TEXTURE_RECTANGLE_ANGLE:
mTextureRectangleEnabled = enabled; mTextureRectangleEnabled = enabled;
return; return;
case GL_SAMPLE_SHADING:
setSampleShading(enabled);
return;
// GL_APPLE_clip_distance/GL_EXT_clip_cull_distance // GL_APPLE_clip_distance/GL_EXT_clip_cull_distance
case GL_CLIP_DISTANCE0_EXT: case GL_CLIP_DISTANCE0_EXT:
case GL_CLIP_DISTANCE1_EXT: case GL_CLIP_DISTANCE1_EXT:
...@@ -1320,7 +1343,8 @@ bool State::getEnableFeature(GLenum feature) const ...@@ -1320,7 +1343,8 @@ bool State::getEnableFeature(GLenum feature) const
return mProgramBinaryCacheEnabled; return mProgramBinaryCacheEnabled;
case GL_TEXTURE_RECTANGLE_ANGLE: case GL_TEXTURE_RECTANGLE_ANGLE:
return mTextureRectangleEnabled; return mTextureRectangleEnabled;
case GL_SAMPLE_SHADING:
return isSampleShadingEnabled();
// GL_APPLE_clip_distance/GL_EXT_clip_cull_distance // GL_APPLE_clip_distance/GL_EXT_clip_cull_distance
case GL_CLIP_DISTANCE0_EXT: case GL_CLIP_DISTANCE0_EXT:
case GL_CLIP_DISTANCE1_EXT: case GL_CLIP_DISTANCE1_EXT:
...@@ -2290,7 +2314,9 @@ void State::getBooleanv(GLenum pname, GLboolean *params) const ...@@ -2290,7 +2314,9 @@ void State::getBooleanv(GLenum pname, GLboolean *params) const
case GL_LIGHT_MODEL_TWO_SIDE: case GL_LIGHT_MODEL_TWO_SIDE:
*params = IsLightModelTwoSided(&mGLES1State); *params = IsLightModelTwoSided(&mGLES1State);
break; break;
case GL_SAMPLE_SHADING:
*params = mIsSampleShadingEnabled;
break;
default: default:
UNREACHABLE(); UNREACHABLE();
break; break;
...@@ -2404,6 +2430,9 @@ void State::getFloatv(GLenum pname, GLfloat *params) const ...@@ -2404,6 +2430,9 @@ void State::getFloatv(GLenum pname, GLfloat *params) const
case GL_POINT_DISTANCE_ATTENUATION: case GL_POINT_DISTANCE_ATTENUATION:
GetPointParameter(&mGLES1State, FromGLenum<PointParameter>(pname), params); GetPointParameter(&mGLES1State, FromGLenum<PointParameter>(pname), params);
break; break;
case GL_MIN_SAMPLE_SHADING_VALUE:
*params = mMinSampleShading;
break;
default: default:
UNREACHABLE(); UNREACHABLE();
break; break;
......
...@@ -247,6 +247,11 @@ class State : angle::NonCopyable ...@@ -247,6 +247,11 @@ class State : angle::NonCopyable
void setMultisampling(bool enabled); void setMultisampling(bool enabled);
bool isMultisamplingEnabled() const { return mMultiSampling; } bool isMultisamplingEnabled() const { return mMultiSampling; }
void setSampleShading(bool enabled);
bool isSampleShadingEnabled() const { return mIsSampleShadingEnabled; }
void setMinSampleShading(float value);
float getMinSampleShading() const { return mMinSampleShading; }
// Scissor test state toggle & query // Scissor test state toggle & query
bool isScissorTestEnabled() const { return mScissorTest; } bool isScissorTestEnabled() const { return mScissorTest; }
void setScissorTest(bool enabled); void setScissorTest(bool enabled);
...@@ -641,6 +646,7 @@ class State : angle::NonCopyable ...@@ -641,6 +646,7 @@ class State : angle::NonCopyable
DIRTY_BIT_FRAMEBUFFER_SRGB, // GL_EXT_sRGB_write_control DIRTY_BIT_FRAMEBUFFER_SRGB, // GL_EXT_sRGB_write_control
DIRTY_BIT_CURRENT_VALUES, DIRTY_BIT_CURRENT_VALUES,
DIRTY_BIT_PROVOKING_VERTEX, DIRTY_BIT_PROVOKING_VERTEX,
DIRTY_BIT_SAMPLE_SHADING,
DIRTY_BIT_EXTENDED, // clip distances, mipmap generation hint, derivative hint. DIRTY_BIT_EXTENDED, // clip distances, mipmap generation hint, derivative hint.
DIRTY_BIT_INVALID, DIRTY_BIT_INVALID,
DIRTY_BIT_MAX = DIRTY_BIT_INVALID, DIRTY_BIT_MAX = DIRTY_BIT_INVALID,
...@@ -961,6 +967,8 @@ class State : angle::NonCopyable ...@@ -961,6 +967,8 @@ class State : angle::NonCopyable
bool mSampleMask; bool mSampleMask;
GLuint mMaxSampleMaskWords; GLuint mMaxSampleMaskWords;
std::array<GLbitfield, MAX_SAMPLE_MASK_WORDS> mSampleMaskValues; std::array<GLbitfield, MAX_SAMPLE_MASK_WORDS> mSampleMaskValues;
bool mIsSampleShadingEnabled;
float mMinSampleShading;
DepthStencilState mDepthStencil; DepthStencilState mDepthStencil;
GLint mStencilRef; GLint mStencilRef;
......
...@@ -3683,9 +3683,14 @@ bool GetQueryParameterInfo(const State &glState, ...@@ -3683,9 +3683,14 @@ bool GetQueryParameterInfo(const State &glState,
*numParams = 1; *numParams = 1;
return true; return true;
case GL_SAMPLE_MASK: case GL_SAMPLE_MASK:
case GL_SAMPLE_SHADING:
*type = GL_BOOL; *type = GL_BOOL;
*numParams = 1; *numParams = 1;
return true; return true;
case GL_MIN_SAMPLE_SHADING_VALUE:
*type = GL_FLOAT;
*numParams = 1;
return true;
} }
if (extensions.geometryShader) if (extensions.geometryShader)
......
...@@ -2059,6 +2059,9 @@ angle::Result StateManagerGL::syncState(const gl::Context *context, ...@@ -2059,6 +2059,9 @@ angle::Result StateManagerGL::syncState(const gl::Context *context,
// TODO(jmadill): handle mipmap generation hint // TODO(jmadill): handle mipmap generation hint
// TODO(jmadill): handle shader derivative hint // TODO(jmadill): handle shader derivative hint
break; break;
case gl::State::DIRTY_BIT_SAMPLE_SHADING:
// Nothing to do until OES_sample_shading is implemented.
break;
default: default:
UNREACHABLE(); UNREACHABLE();
break; break;
......
...@@ -866,6 +866,9 @@ angle::Result ContextMtl::syncState(const gl::Context *context, ...@@ -866,6 +866,9 @@ angle::Result ContextMtl::syncState(const gl::Context *context,
case gl::State::DIRTY_BIT_EXTENDED: case gl::State::DIRTY_BIT_EXTENDED:
updateExtendedState(glState); updateExtendedState(glState);
break; break;
case gl::State::DIRTY_BIT_SAMPLE_SHADING:
// Nothing to do until OES_sample_shading is implemented.
break;
default: default:
UNREACHABLE(); UNREACHABLE();
break; break;
......
...@@ -3221,6 +3221,11 @@ angle::Result ContextVk::syncState(const gl::Context *context, ...@@ -3221,6 +3221,11 @@ angle::Result ContextVk::syncState(const gl::Context *context,
mGraphicsPipelineDesc->updateAlphaToOneEnable(&mGraphicsPipelineTransition, mGraphicsPipelineDesc->updateAlphaToOneEnable(&mGraphicsPipelineTransition,
glState.isSampleAlphaToOneEnabled()); glState.isSampleAlphaToOneEnabled());
break; break;
case gl::State::DIRTY_BIT_SAMPLE_SHADING:
mGraphicsPipelineDesc->updateSampleShading(&mGraphicsPipelineTransition,
glState.isSampleShadingEnabled(),
glState.getMinSampleShading());
break;
case gl::State::DIRTY_BIT_COVERAGE_MODULATION: case gl::State::DIRTY_BIT_COVERAGE_MODULATION:
break; break;
case gl::State::DIRTY_BIT_FRAMEBUFFER_SRGB: case gl::State::DIRTY_BIT_FRAMEBUFFER_SRGB:
......
...@@ -1335,6 +1335,8 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF ...@@ -1335,6 +1335,8 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF
mPhysicalDeviceFeatures.shaderStorageBufferArrayDynamicIndexing; mPhysicalDeviceFeatures.shaderStorageBufferArrayDynamicIndexing;
// Used to support APPLE_clip_distance // Used to support APPLE_clip_distance
enabledFeatures.features.shaderClipDistance = mPhysicalDeviceFeatures.shaderClipDistance; enabledFeatures.features.shaderClipDistance = mPhysicalDeviceFeatures.shaderClipDistance;
// Used to support OES_sample_shading
enabledFeatures.features.sampleRateShading = mPhysicalDeviceFeatures.sampleRateShading;
if (!vk::CommandBuffer::ExecutesInline()) if (!vk::CommandBuffer::ExecutesInline())
{ {
......
...@@ -1333,7 +1333,7 @@ void GraphicsPipelineDesc::initDefaults() ...@@ -1333,7 +1333,7 @@ void GraphicsPipelineDesc::initDefaults()
mRasterizationAndMultisampleStateInfo.bits.rasterizationSamples = 1; mRasterizationAndMultisampleStateInfo.bits.rasterizationSamples = 1;
mRasterizationAndMultisampleStateInfo.bits.sampleShadingEnable = 0; mRasterizationAndMultisampleStateInfo.bits.sampleShadingEnable = 0;
mRasterizationAndMultisampleStateInfo.minSampleShading = 0.0f; mRasterizationAndMultisampleStateInfo.minSampleShading = 1.0f;
for (uint32_t &sampleMask : mRasterizationAndMultisampleStateInfo.sampleMask) for (uint32_t &sampleMask : mRasterizationAndMultisampleStateInfo.sampleMask)
{ {
sampleMask = 0xFFFFFFFF; sampleMask = 0xFFFFFFFF;
...@@ -1873,6 +1873,18 @@ void GraphicsPipelineDesc::updateSampleMask(GraphicsPipelineTransitionBits *tran ...@@ -1873,6 +1873,18 @@ void GraphicsPipelineDesc::updateSampleMask(GraphicsPipelineTransitionBits *tran
sampleMask, maskNumber, kMaskBits)); sampleMask, maskNumber, kMaskBits));
} }
void GraphicsPipelineDesc::updateSampleShading(GraphicsPipelineTransitionBits *transition,
bool enable,
float value)
{
mRasterizationAndMultisampleStateInfo.bits.sampleShadingEnable = enable;
mRasterizationAndMultisampleStateInfo.minSampleShading = (enable ? value : 1.0f);
transition->set(ANGLE_GET_TRANSITION_BIT(mRasterizationAndMultisampleStateInfo, bits));
transition->set(
ANGLE_GET_TRANSITION_BIT(mRasterizationAndMultisampleStateInfo, minSampleShading));
}
void GraphicsPipelineDesc::updateBlendColor(GraphicsPipelineTransitionBits *transition, void GraphicsPipelineDesc::updateBlendColor(GraphicsPipelineTransitionBits *transition,
const gl::ColorF &color) const gl::ColorF &color)
{ {
......
...@@ -594,6 +594,8 @@ class GraphicsPipelineDesc final ...@@ -594,6 +594,8 @@ class GraphicsPipelineDesc final
uint32_t maskNumber, uint32_t maskNumber,
uint32_t mask); uint32_t mask);
void updateSampleShading(GraphicsPipelineTransitionBits *transition, bool enable, float value);
// RenderPass description. // RenderPass description.
const RenderPassDesc &getRenderPassDesc() const { return mRenderPassDesc; } const RenderPassDesc &getRenderPassDesc() const { return mRenderPassDesc; }
......
...@@ -205,6 +205,14 @@ void RendererVk::ensureCapsInitialized() const ...@@ -205,6 +205,14 @@ void RendererVk::ensureCapsInitialized() const
mNativeExtensions.shadowSamplersEXT = true; mNativeExtensions.shadowSamplersEXT = true;
// From the Vulkan specs:
// sampleRateShading specifies whether Sample Shading and multisample interpolation are
// supported. If this feature is not enabled, the sampleShadingEnable member of the
// VkPipelineMultisampleStateCreateInfo structure must be set to VK_FALSE and the
// minSampleShading member is ignored. This also specifies whether shader modules can declare
// the SampleRateShading capability
mNativeExtensions.sampleShadingOES = (mPhysicalDeviceFeatures.sampleRateShading == VK_TRUE);
// https://vulkan.lunarg.com/doc/view/1.0.30.0/linux/vkspec.chunked/ch31s02.html // https://vulkan.lunarg.com/doc/view/1.0.30.0/linux/vkspec.chunked/ch31s02.html
mNativeCaps.maxElementIndex = std::numeric_limits<GLuint>::max() - 1; mNativeCaps.maxElementIndex = std::numeric_limits<GLuint>::max() - 1;
mNativeCaps.max3DTextureSize = LimitToInt(limitsVk.maxImageDimension3D); mNativeCaps.max3DTextureSize = LimitToInt(limitsVk.maxImageDimension3D);
......
...@@ -716,6 +716,8 @@ bool ValidCap(const Context *context, GLenum cap, bool queryOnly) ...@@ -716,6 +716,8 @@ bool ValidCap(const Context *context, GLenum cap, bool queryOnly)
return true; return true;
} }
break; break;
case GL_SAMPLE_SHADING:
return context->getExtensions().sampleShadingOES;
} }
// GLES1 emulation: GLES1-specific caps after this point // GLES1 emulation: GLES1-specific caps after this point
......
...@@ -2008,8 +2008,13 @@ bool ValidateSampleMaski(const Context *context, GLuint maskNumber, GLbitfield m ...@@ -2008,8 +2008,13 @@ bool ValidateSampleMaski(const Context *context, GLuint maskNumber, GLbitfield m
bool ValidateMinSampleShadingOES(const Context *context, GLfloat value) bool ValidateMinSampleShadingOES(const Context *context, GLfloat value)
{ {
UNIMPLEMENTED(); if (!context->getExtensions().sampleShadingOES)
return false; {
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return true;
} }
bool ValidateFramebufferTextureEXT(const Context *context, bool ValidateFramebufferTextureEXT(const Context *context,
......
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