Merge pull request #1444 from billhollings/dynamic-pipeline-state-fix
Ensure dynamic pipeline state always respects pipeline dynamic flags.
This commit is contained in:
commit
d833ce95d7
@ -22,6 +22,8 @@ Released TBD
|
|||||||
- Improved checks for timestamp GPU counter support on older devices.
|
- Improved checks for timestamp GPU counter support on older devices.
|
||||||
- Fix incorrect validation error on multilayer `VkImage` marked for rendering, when multilayered-rendering
|
- Fix incorrect validation error on multilayer `VkImage` marked for rendering, when multilayered-rendering
|
||||||
is not supported on platform, but app doesn't actually attempt to render to multiple layers.
|
is not supported on platform, but app doesn't actually attempt to render to multiple layers.
|
||||||
|
- Fix dynamic pipeline state such as `vkCmdSetDepthBias()` sometimes ignoring pipeline dyamic
|
||||||
|
state flags when called before `vkCmdBindPipeline()`.
|
||||||
- Update to latest SPIRV-Cross version:
|
- Update to latest SPIRV-Cross version:
|
||||||
- MSL: Add support for `OpSpecConstantOp` ops `OpQuantizeToF16` and `OpSRem`.
|
- MSL: Add support for `OpSpecConstantOp` ops `OpQuantizeToF16` and `OpSRem`.
|
||||||
- MSL: Return fragment function value even when last SPIR-V Op is discard (`OpKill`).
|
- MSL: Return fragment function value even when last SPIR-V Op is discard (`OpKill`).
|
||||||
|
@ -276,20 +276,18 @@ void MVKDepthStencilCommandEncoderState::setStencilState(MVKMTLStencilDescriptor
|
|||||||
stencilInfo.depthFailureOperation = mvkMTLStencilOperationFromVkStencilOp(vkStencil.depthFailOp);
|
stencilInfo.depthFailureOperation = mvkMTLStencilOperationFromVkStencilOp(vkStencil.depthFailOp);
|
||||||
stencilInfo.depthStencilPassOperation = mvkMTLStencilOperationFromVkStencilOp(vkStencil.passOp);
|
stencilInfo.depthStencilPassOperation = mvkMTLStencilOperationFromVkStencilOp(vkStencil.passOp);
|
||||||
|
|
||||||
bool useCompareMask = !_cmdEncoder->supportsDynamicState(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
|
if ( !_cmdEncoder->supportsDynamicState(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK) ) {
|
||||||
if (useCompareMask) { stencilInfo.readMask = vkStencil.compareMask; }
|
stencilInfo.readMask = vkStencil.compareMask;
|
||||||
|
}
|
||||||
bool useWriteMask = !_cmdEncoder->supportsDynamicState(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
|
if ( !_cmdEncoder->supportsDynamicState(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK) ) {
|
||||||
if (useWriteMask) { stencilInfo.writeMask = vkStencil.writeMask; }
|
stencilInfo.writeMask = vkStencil.writeMask;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We don't check for dynamic state here, because if this is called before pipeline is set,
|
||||||
|
// it may not be accurate, and if not dynamic, pipeline will override when it is encoded anyway.
|
||||||
void MVKDepthStencilCommandEncoderState::setStencilCompareMask(VkStencilFaceFlags faceMask,
|
void MVKDepthStencilCommandEncoderState::setStencilCompareMask(VkStencilFaceFlags faceMask,
|
||||||
uint32_t stencilCompareMask) {
|
uint32_t stencilCompareMask) {
|
||||||
|
|
||||||
// If we can't set the state, or nothing is being set, just leave
|
|
||||||
if ( !(_cmdEncoder->supportsDynamicState(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK) &&
|
|
||||||
mvkIsAnyFlagEnabled(faceMask, VK_STENCIL_FRONT_AND_BACK)) ) { return; }
|
|
||||||
|
|
||||||
if (mvkAreAllFlagsEnabled(faceMask, VK_STENCIL_FACE_FRONT_BIT)) {
|
if (mvkAreAllFlagsEnabled(faceMask, VK_STENCIL_FACE_FRONT_BIT)) {
|
||||||
_depthStencilData.frontFaceStencilData.readMask = stencilCompareMask;
|
_depthStencilData.frontFaceStencilData.readMask = stencilCompareMask;
|
||||||
}
|
}
|
||||||
@ -300,13 +298,10 @@ void MVKDepthStencilCommandEncoderState::setStencilCompareMask(VkStencilFaceFlag
|
|||||||
markDirty();
|
markDirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We don't check for dynamic state here, because if this is called before pipeline is set,
|
||||||
|
// it may not be accurate, and if not dynamic, pipeline will override when it is encoded anyway.
|
||||||
void MVKDepthStencilCommandEncoderState::setStencilWriteMask(VkStencilFaceFlags faceMask,
|
void MVKDepthStencilCommandEncoderState::setStencilWriteMask(VkStencilFaceFlags faceMask,
|
||||||
uint32_t stencilWriteMask) {
|
uint32_t stencilWriteMask) {
|
||||||
|
|
||||||
// If we can't set the state, or nothing is being set, just leave
|
|
||||||
if ( !(_cmdEncoder->supportsDynamicState(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK) &&
|
|
||||||
mvkIsAnyFlagEnabled(faceMask, VK_STENCIL_FRONT_AND_BACK)) ) { return; }
|
|
||||||
|
|
||||||
if (mvkAreAllFlagsEnabled(faceMask, VK_STENCIL_FACE_FRONT_BIT)) {
|
if (mvkAreAllFlagsEnabled(faceMask, VK_STENCIL_FACE_FRONT_BIT)) {
|
||||||
_depthStencilData.frontFaceStencilData.writeMask = stencilWriteMask;
|
_depthStencilData.frontFaceStencilData.writeMask = stencilWriteMask;
|
||||||
}
|
}
|
||||||
@ -360,20 +355,16 @@ void MVKStencilReferenceValueCommandEncoderState:: setReferenceValues(const VkPi
|
|||||||
markDirty();
|
markDirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We don't check for dynamic state here, because if this is called before pipeline is set,
|
||||||
|
// it may not be accurate, and if not dynamic, pipeline will override when it is encoded anyway.
|
||||||
void MVKStencilReferenceValueCommandEncoderState::setReferenceValues(VkStencilFaceFlags faceMask,
|
void MVKStencilReferenceValueCommandEncoderState::setReferenceValues(VkStencilFaceFlags faceMask,
|
||||||
uint32_t stencilReference) {
|
uint32_t stencilReference) {
|
||||||
|
|
||||||
// If we can't set the state, or nothing is being set, just leave
|
|
||||||
if ( !(_cmdEncoder->supportsDynamicState(VK_DYNAMIC_STATE_STENCIL_REFERENCE) &&
|
|
||||||
mvkIsAnyFlagEnabled(faceMask, VK_STENCIL_FRONT_AND_BACK)) ) { return; }
|
|
||||||
|
|
||||||
if (mvkAreAllFlagsEnabled(faceMask, VK_STENCIL_FACE_FRONT_BIT)) {
|
if (mvkAreAllFlagsEnabled(faceMask, VK_STENCIL_FACE_FRONT_BIT)) {
|
||||||
_frontFaceValue = stencilReference;
|
_frontFaceValue = stencilReference;
|
||||||
}
|
}
|
||||||
if (mvkAreAllFlagsEnabled(faceMask, VK_STENCIL_FACE_BACK_BIT)) {
|
if (mvkAreAllFlagsEnabled(faceMask, VK_STENCIL_FACE_BACK_BIT)) {
|
||||||
_backFaceValue = stencilReference;
|
_backFaceValue = stencilReference;
|
||||||
}
|
}
|
||||||
|
|
||||||
markDirty();
|
markDirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -401,12 +392,11 @@ void MVKDepthBiasCommandEncoderState::setDepthBias(const VkPipelineRasterization
|
|||||||
markDirty();
|
markDirty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We don't check for dynamic state here, because if this is called before pipeline is set,
|
||||||
|
// it may not be accurate, and if not dynamic, pipeline will override when it is encoded anyway.
|
||||||
void MVKDepthBiasCommandEncoderState::setDepthBias(float depthBiasConstantFactor,
|
void MVKDepthBiasCommandEncoderState::setDepthBias(float depthBiasConstantFactor,
|
||||||
float depthBiasSlopeFactor,
|
float depthBiasSlopeFactor,
|
||||||
float depthBiasClamp) {
|
float depthBiasClamp) {
|
||||||
|
|
||||||
if ( !_cmdEncoder->supportsDynamicState(VK_DYNAMIC_STATE_DEPTH_BIAS) ) { return; }
|
|
||||||
|
|
||||||
_depthBiasConstantFactor = depthBiasConstantFactor;
|
_depthBiasConstantFactor = depthBiasConstantFactor;
|
||||||
_depthBiasSlopeFactor = depthBiasSlopeFactor;
|
_depthBiasSlopeFactor = depthBiasSlopeFactor;
|
||||||
_depthBiasClamp = depthBiasClamp;
|
_depthBiasClamp = depthBiasClamp;
|
||||||
@ -432,9 +422,8 @@ void MVKDepthBiasCommandEncoderState::encodeImpl(uint32_t stage) {
|
|||||||
void MVKBlendColorCommandEncoderState::setBlendColor(float red, float green,
|
void MVKBlendColorCommandEncoderState::setBlendColor(float red, float green,
|
||||||
float blue, float alpha,
|
float blue, float alpha,
|
||||||
bool isDynamic) {
|
bool isDynamic) {
|
||||||
|
// Abort if we are using dynamic, but call is not dynamic.
|
||||||
// Abort if dynamic allowed but call is not dynamic, or vice-versa
|
if ( !isDynamic && _cmdEncoder->supportsDynamicState(VK_DYNAMIC_STATE_BLEND_CONSTANTS) ) { return; }
|
||||||
if ( !(_cmdEncoder->supportsDynamicState(VK_DYNAMIC_STATE_BLEND_CONSTANTS) == isDynamic) ) { return; }
|
|
||||||
|
|
||||||
_red = red;
|
_red = red;
|
||||||
_green = green;
|
_green = green;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user