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()
map["GL_EXT_EGL_image_array"] = enableableExtension(&Extensions::eglImageArray);
map["GL_EXT_buffer_storage"] = enableableExtension(&Extensions::bufferStorageEXT);
map["GL_OES_texture_stencil8"] = enableableExtension(&Extensions::stencilIndex8);
map["GL_OES_sample_shading"] = enableableExtension(&Extensions::sampleShadingOES);
// GLES1 extensions
map["GL_OES_point_size_array"] = enableableExtension(&Extensions::pointSizeArrayOES);
map["GL_OES_texture_cube_map"] = enableableExtension(&Extensions::textureCubeMapOES);
......
......@@ -650,6 +650,9 @@ struct Extensions
// GL_OES_texture_stencil8
bool stencilIndex8 = false;
// GL_OES_sample_shading
bool sampleShadingOES = false;
};
// Pointer to a boolean memeber of the Extensions struct
......
......@@ -7260,7 +7260,7 @@ void Context::deleteSamplers(GLsizei count, const SamplerID *samplers)
void Context::minSampleShading(GLfloat value)
{
UNIMPLEMENTED();
mState.setMinSampleShading(value);
}
void Context::getInternalformativ(GLenum target,
......
......@@ -327,6 +327,8 @@ State::State(const State *shareContextState,
mSampleCoverageInvert(false),
mSampleMask(false),
mMaxSampleMaskWords(0),
mIsSampleShadingEnabled(false),
mMinSampleShading(0.0f),
mStencilRef(0),
mStencilBackRef(0),
mLineWidth(0),
......@@ -1071,6 +1073,24 @@ void State::setMultisampling(bool enabled)
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)
{
if (mScissorTest != enabled)
......@@ -1177,6 +1197,9 @@ void State::setEnableFeature(GLenum feature, bool enabled)
case GL_TEXTURE_RECTANGLE_ANGLE:
mTextureRectangleEnabled = enabled;
return;
case GL_SAMPLE_SHADING:
setSampleShading(enabled);
return;
// GL_APPLE_clip_distance/GL_EXT_clip_cull_distance
case GL_CLIP_DISTANCE0_EXT:
case GL_CLIP_DISTANCE1_EXT:
......@@ -1320,7 +1343,8 @@ bool State::getEnableFeature(GLenum feature) const
return mProgramBinaryCacheEnabled;
case GL_TEXTURE_RECTANGLE_ANGLE:
return mTextureRectangleEnabled;
case GL_SAMPLE_SHADING:
return isSampleShadingEnabled();
// GL_APPLE_clip_distance/GL_EXT_clip_cull_distance
case GL_CLIP_DISTANCE0_EXT:
case GL_CLIP_DISTANCE1_EXT:
......@@ -2290,7 +2314,9 @@ void State::getBooleanv(GLenum pname, GLboolean *params) const
case GL_LIGHT_MODEL_TWO_SIDE:
*params = IsLightModelTwoSided(&mGLES1State);
break;
case GL_SAMPLE_SHADING:
*params = mIsSampleShadingEnabled;
break;
default:
UNREACHABLE();
break;
......@@ -2404,6 +2430,9 @@ void State::getFloatv(GLenum pname, GLfloat *params) const
case GL_POINT_DISTANCE_ATTENUATION:
GetPointParameter(&mGLES1State, FromGLenum<PointParameter>(pname), params);
break;
case GL_MIN_SAMPLE_SHADING_VALUE:
*params = mMinSampleShading;
break;
default:
UNREACHABLE();
break;
......
......@@ -247,6 +247,11 @@ class State : angle::NonCopyable
void setMultisampling(bool enabled);
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
bool isScissorTestEnabled() const { return mScissorTest; }
void setScissorTest(bool enabled);
......@@ -641,6 +646,7 @@ class State : angle::NonCopyable
DIRTY_BIT_FRAMEBUFFER_SRGB, // GL_EXT_sRGB_write_control
DIRTY_BIT_CURRENT_VALUES,
DIRTY_BIT_PROVOKING_VERTEX,
DIRTY_BIT_SAMPLE_SHADING,
DIRTY_BIT_EXTENDED, // clip distances, mipmap generation hint, derivative hint.
DIRTY_BIT_INVALID,
DIRTY_BIT_MAX = DIRTY_BIT_INVALID,
......@@ -961,6 +967,8 @@ class State : angle::NonCopyable
bool mSampleMask;
GLuint mMaxSampleMaskWords;
std::array<GLbitfield, MAX_SAMPLE_MASK_WORDS> mSampleMaskValues;
bool mIsSampleShadingEnabled;
float mMinSampleShading;
DepthStencilState mDepthStencil;
GLint mStencilRef;
......
......@@ -3683,9 +3683,14 @@ bool GetQueryParameterInfo(const State &glState,
*numParams = 1;
return true;
case GL_SAMPLE_MASK:
case GL_SAMPLE_SHADING:
*type = GL_BOOL;
*numParams = 1;
return true;
case GL_MIN_SAMPLE_SHADING_VALUE:
*type = GL_FLOAT;
*numParams = 1;
return true;
}
if (extensions.geometryShader)
......
......@@ -2059,6 +2059,9 @@ angle::Result StateManagerGL::syncState(const gl::Context *context,
// TODO(jmadill): handle mipmap generation hint
// TODO(jmadill): handle shader derivative hint
break;
case gl::State::DIRTY_BIT_SAMPLE_SHADING:
// Nothing to do until OES_sample_shading is implemented.
break;
default:
UNREACHABLE();
break;
......
......@@ -866,6 +866,9 @@ angle::Result ContextMtl::syncState(const gl::Context *context,
case gl::State::DIRTY_BIT_EXTENDED:
updateExtendedState(glState);
break;
case gl::State::DIRTY_BIT_SAMPLE_SHADING:
// Nothing to do until OES_sample_shading is implemented.
break;
default:
UNREACHABLE();
break;
......
......@@ -3221,6 +3221,11 @@ angle::Result ContextVk::syncState(const gl::Context *context,
mGraphicsPipelineDesc->updateAlphaToOneEnable(&mGraphicsPipelineTransition,
glState.isSampleAlphaToOneEnabled());
break;
case gl::State::DIRTY_BIT_SAMPLE_SHADING:
mGraphicsPipelineDesc->updateSampleShading(&mGraphicsPipelineTransition,
glState.isSampleShadingEnabled(),
glState.getMinSampleShading());
break;
case gl::State::DIRTY_BIT_COVERAGE_MODULATION:
break;
case gl::State::DIRTY_BIT_FRAMEBUFFER_SRGB:
......
......@@ -1335,6 +1335,8 @@ angle::Result RendererVk::initializeDevice(DisplayVk *displayVk, uint32_t queueF
mPhysicalDeviceFeatures.shaderStorageBufferArrayDynamicIndexing;
// Used to support APPLE_clip_distance
enabledFeatures.features.shaderClipDistance = mPhysicalDeviceFeatures.shaderClipDistance;
// Used to support OES_sample_shading
enabledFeatures.features.sampleRateShading = mPhysicalDeviceFeatures.sampleRateShading;
if (!vk::CommandBuffer::ExecutesInline())
{
......
......@@ -1333,7 +1333,7 @@ void GraphicsPipelineDesc::initDefaults()
mRasterizationAndMultisampleStateInfo.bits.rasterizationSamples = 1;
mRasterizationAndMultisampleStateInfo.bits.sampleShadingEnable = 0;
mRasterizationAndMultisampleStateInfo.minSampleShading = 0.0f;
mRasterizationAndMultisampleStateInfo.minSampleShading = 1.0f;
for (uint32_t &sampleMask : mRasterizationAndMultisampleStateInfo.sampleMask)
{
sampleMask = 0xFFFFFFFF;
......@@ -1873,6 +1873,18 @@ void GraphicsPipelineDesc::updateSampleMask(GraphicsPipelineTransitionBits *tran
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,
const gl::ColorF &color)
{
......
......@@ -594,6 +594,8 @@ class GraphicsPipelineDesc final
uint32_t maskNumber,
uint32_t mask);
void updateSampleShading(GraphicsPipelineTransitionBits *transition, bool enable, float value);
// RenderPass description.
const RenderPassDesc &getRenderPassDesc() const { return mRenderPassDesc; }
......
......@@ -205,6 +205,14 @@ void RendererVk::ensureCapsInitialized() const
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
mNativeCaps.maxElementIndex = std::numeric_limits<GLuint>::max() - 1;
mNativeCaps.max3DTextureSize = LimitToInt(limitsVk.maxImageDimension3D);
......
......@@ -716,6 +716,8 @@ bool ValidCap(const Context *context, GLenum cap, bool queryOnly)
return true;
}
break;
case GL_SAMPLE_SHADING:
return context->getExtensions().sampleShadingOES;
}
// GLES1 emulation: GLES1-specific caps after this point
......
......@@ -2008,8 +2008,13 @@ bool ValidateSampleMaski(const Context *context, GLuint maskNumber, GLbitfield m
bool ValidateMinSampleShadingOES(const Context *context, GLfloat value)
{
UNIMPLEMENTED();
if (!context->getExtensions().sampleShadingOES)
{
context->validationError(GL_INVALID_OPERATION, kExtensionNotEnabled);
return false;
}
return true;
}
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