Clear attachments support separate depth and stencil attachments.
- Also rename kMVKCachedColorAttachmentCount to kMVKMaxColorAttachmentCount and kMVKCachedViewportScissorCount to kMVKMaxViewportScissorCount and (unrelated)
This commit is contained in:
parent
abb12a5288
commit
fd6b97317d
@ -262,7 +262,7 @@ protected:
|
||||
|
||||
// Concrete template class implementations.
|
||||
typedef MVKCmdSetViewport<1> MVKCmdSetViewport1;
|
||||
typedef MVKCmdSetViewport<kMVKCachedViewportScissorCount> MVKCmdSetViewportMulti;
|
||||
typedef MVKCmdSetViewport<kMVKMaxViewportScissorCount> MVKCmdSetViewportMulti;
|
||||
|
||||
|
||||
#pragma mark -
|
||||
@ -292,7 +292,7 @@ protected:
|
||||
|
||||
// Concrete template class implementations.
|
||||
typedef MVKCmdSetScissor<1> MVKCmdSetScissor1;
|
||||
typedef MVKCmdSetScissor<kMVKCachedViewportScissorCount> MVKCmdSetScissorMulti;
|
||||
typedef MVKCmdSetScissor<kMVKMaxViewportScissorCount> MVKCmdSetScissorMulti;
|
||||
|
||||
|
||||
#pragma mark -
|
||||
|
@ -282,7 +282,7 @@ void MVKCmdSetViewport<N>::encode(MVKCommandEncoder* cmdEncoder) {
|
||||
}
|
||||
|
||||
template class MVKCmdSetViewport<1>;
|
||||
template class MVKCmdSetViewport<kMVKCachedViewportScissorCount>;
|
||||
template class MVKCmdSetViewport<kMVKMaxViewportScissorCount>;
|
||||
|
||||
|
||||
#pragma mark -
|
||||
@ -309,7 +309,7 @@ void MVKCmdSetScissor<N>::encode(MVKCommandEncoder* cmdEncoder) {
|
||||
}
|
||||
|
||||
template class MVKCmdSetScissor<1>;
|
||||
template class MVKCmdSetScissor<kMVKCachedViewportScissorCount>;
|
||||
template class MVKCmdSetScissor<kMVKMaxViewportScissorCount>;
|
||||
|
||||
|
||||
#pragma mark -
|
||||
|
@ -284,8 +284,6 @@ protected:
|
||||
float _mtlDepthVal;
|
||||
uint32_t _mtlStencilValue;
|
||||
MVKCommandUse _commandUse;
|
||||
bool _isClearingDepth;
|
||||
bool _isClearingStencil;
|
||||
};
|
||||
|
||||
|
||||
@ -326,7 +324,7 @@ protected:
|
||||
VkClearValue& getClearValue(uint32_t attIdx) override { return _vkClearValues[attIdx]; }
|
||||
void setClearValue(uint32_t attIdx, const VkClearValue& clearValue) override { _vkClearValues[attIdx] = clearValue; }
|
||||
|
||||
VkClearValue _vkClearValues[kMVKCachedColorAttachmentCount];
|
||||
VkClearValue _vkClearValues[kMVKMaxColorAttachmentCount];
|
||||
};
|
||||
|
||||
typedef MVKCmdClearMultiAttachments<1> MVKCmdClearMultiAttachments1;
|
||||
|
@ -1260,8 +1260,6 @@ VkResult MVKCmdClearAttachments<N>::setContent(MVKCommandBuffer* cmdBuff,
|
||||
_commandUse = cmdUse;
|
||||
_mtlDepthVal = 0.0;
|
||||
_mtlStencilValue = 0;
|
||||
_isClearingDepth = false;
|
||||
_isClearingStencil = false;
|
||||
MVKPixelFormats* pixFmts = cmdBuff->getPixelFormats();
|
||||
|
||||
// For each attachment to be cleared, mark it so in the render pipeline state
|
||||
@ -1279,14 +1277,12 @@ VkResult MVKCmdClearAttachments<N>::setContent(MVKCommandBuffer* cmdBuff,
|
||||
}
|
||||
|
||||
if (mvkIsAnyFlagEnabled(clrAtt.aspectMask, VK_IMAGE_ASPECT_DEPTH_BIT)) {
|
||||
_isClearingDepth = true;
|
||||
_rpsKey.enableAttachment(kMVKClearAttachmentDepthStencilIndex);
|
||||
_rpsKey.enableAttachment(kMVKClearAttachmentDepthIndex);
|
||||
_mtlDepthVal = pixFmts->getMTLClearDepthValue(clrAtt.clearValue);
|
||||
}
|
||||
|
||||
if (mvkIsAnyFlagEnabled(clrAtt.aspectMask, VK_IMAGE_ASPECT_STENCIL_BIT)) {
|
||||
_isClearingStencil = true;
|
||||
_rpsKey.enableAttachment(kMVKClearAttachmentDepthStencilIndex);
|
||||
_rpsKey.enableAttachment(kMVKClearAttachmentStencilIndex);
|
||||
_mtlStencilValue = pixFmts->getMTLClearStencilValue(clrAtt.clearValue);
|
||||
}
|
||||
}
|
||||
@ -1443,20 +1439,14 @@ void MVKCmdClearAttachments<N>::encode(MVKCommandEncoder* cmdEncoder) {
|
||||
clearColors[caIdx] = { (float)mtlCC.red, (float)mtlCC.green, (float)mtlCC.blue, (float)mtlCC.alpha};
|
||||
}
|
||||
|
||||
// The depth value (including vertex position Z value) is held in the last index.
|
||||
clearColors[kMVKClearAttachmentDepthStencilIndex] = { _mtlDepthVal, _mtlDepthVal, _mtlDepthVal, _mtlDepthVal };
|
||||
// The depth value is the vertex position Z value.
|
||||
clearColors[kMVKClearAttachmentDepthIndex] = { _mtlDepthVal, _mtlDepthVal, _mtlDepthVal, _mtlDepthVal };
|
||||
|
||||
MTLPixelFormat mtlDSFmt = pixFmts->getMTLPixelFormat(subpass->isStencilAttachmentUsed()
|
||||
? subpass->getStencilFormat()
|
||||
: subpass->getDepthFormat());
|
||||
_rpsKey.attachmentMTLPixelFormats[kMVKClearAttachmentDepthStencilIndex] = mtlDSFmt;
|
||||
_rpsKey.attachmentMTLPixelFormats[kMVKClearAttachmentDepthIndex] = pixFmts->getMTLPixelFormat(subpass->getDepthFormat());
|
||||
if ( !subpass->isDepthAttachmentUsed() ) { _rpsKey.disableAttachment(kMVKClearAttachmentDepthIndex); }
|
||||
|
||||
// If neither the depth or stencil attachments are being cleared, nor being used, don't try to clear them.
|
||||
bool isClearingDepth = _isClearingDepth && subpass->isDepthAttachmentUsed();
|
||||
bool isClearingStencil = _isClearingStencil && subpass->isStencilAttachmentUsed();
|
||||
if ( !isClearingDepth && !isClearingStencil ) {
|
||||
_rpsKey.disableAttachment(kMVKClearAttachmentDepthStencilIndex);
|
||||
}
|
||||
_rpsKey.attachmentMTLPixelFormats[kMVKClearAttachmentStencilIndex] = pixFmts->getMTLPixelFormat(subpass->getStencilFormat());
|
||||
if ( !subpass->isStencilAttachmentUsed() ) { _rpsKey.disableAttachment(kMVKClearAttachmentStencilIndex); }
|
||||
|
||||
if ( !_rpsKey.isAnyAttachmentEnabled() ) { return; }
|
||||
|
||||
@ -1465,7 +1455,8 @@ void MVKCmdClearAttachments<N>::encode(MVKCommandEncoder* cmdEncoder) {
|
||||
id<MTLRenderCommandEncoder> mtlRendEnc = cmdEncoder->_mtlRenderEncoder;
|
||||
[mtlRendEnc pushDebugGroup: getMTLDebugGroupLabel()];
|
||||
[mtlRendEnc setRenderPipelineState: cmdEncPool->getCmdClearMTLRenderPipelineState(_rpsKey)];
|
||||
[mtlRendEnc setDepthStencilState: cmdEncPool->getMTLDepthStencilState(isClearingDepth, isClearingStencil)];
|
||||
[mtlRendEnc setDepthStencilState: cmdEncPool->getMTLDepthStencilState(_rpsKey.isAttachmentUsed(kMVKClearAttachmentDepthIndex),
|
||||
_rpsKey.isAttachmentUsed(kMVKClearAttachmentStencilIndex))];
|
||||
[mtlRendEnc setStencilReferenceValue: _mtlStencilValue];
|
||||
[mtlRendEnc setCullMode: MTLCullModeNone];
|
||||
[mtlRendEnc setTriangleFillMode: MTLTriangleFillModeFill];
|
||||
|
@ -152,7 +152,7 @@ public:
|
||||
protected:
|
||||
void encodeImpl(uint32_t stage) override;
|
||||
|
||||
MVKSmallVector<VkViewport, kMVKCachedViewportScissorCount> _viewports, _dynamicViewports;
|
||||
MVKSmallVector<VkViewport, kMVKMaxViewportScissorCount> _viewports, _dynamicViewports;
|
||||
};
|
||||
|
||||
|
||||
@ -180,7 +180,7 @@ public:
|
||||
protected:
|
||||
void encodeImpl(uint32_t stage) override;
|
||||
|
||||
MVKSmallVector<VkRect2D, kMVKCachedViewportScissorCount> _scissors, _dynamicScissors;
|
||||
MVKSmallVector<VkRect2D, kMVKMaxViewportScissorCount> _scissors, _dynamicScissors;
|
||||
};
|
||||
|
||||
|
||||
|
@ -107,9 +107,11 @@ namespace std {
|
||||
#pragma mark -
|
||||
#pragma mark MVKRPSKeyClearAtt
|
||||
|
||||
#define kMVKClearAttachmentCount (kMVKCachedColorAttachmentCount + 1)
|
||||
#define kMVKClearAttachmentDepthStencilIndex (kMVKClearAttachmentCount - 1)
|
||||
#define kMVKClearAttachmentLayeredRenderingBitIndex kMVKClearAttachmentCount
|
||||
const static uint32_t kMVKClearColorAttachmentCount = kMVKMaxColorAttachmentCount;
|
||||
const static uint32_t kMVKClearAttachmentDepthIndex = kMVKClearColorAttachmentCount;
|
||||
const static uint32_t kMVKClearAttachmentStencilIndex = kMVKClearAttachmentDepthIndex + 1;
|
||||
const static uint32_t kMVKClearAttachmentCount = kMVKClearAttachmentStencilIndex + 1;
|
||||
const static uint32_t kMVKClearAttachmentLayeredRenderingBitIndex = kMVKClearAttachmentStencilIndex + 1;
|
||||
|
||||
/**
|
||||
* Key to use for looking up cached MTLRenderPipelineState instances.
|
||||
|
@ -113,6 +113,8 @@ id<MTLSamplerState> MVKCommandResourceFactory::newCmdBlitImageMTLSamplerState(MT
|
||||
|
||||
id<MTLRenderPipelineState> MVKCommandResourceFactory::newCmdClearMTLRenderPipelineState(MVKRPSKeyClearAtt& attKey,
|
||||
MVKVulkanAPIDeviceObject* owner) {
|
||||
MVKPixelFormats* pixFmts = getPixelFormats();
|
||||
|
||||
id<MTLFunction> vtxFunc = newClearVertFunction(attKey); // temp retain
|
||||
id<MTLFunction> fragFunc = newClearFragFunction(attKey); // temp retain
|
||||
MTLRenderPipelineDescriptor* plDesc = [MTLRenderPipelineDescriptor new]; // temp retain
|
||||
@ -122,15 +124,17 @@ id<MTLRenderPipelineState> MVKCommandResourceFactory::newCmdClearMTLRenderPipeli
|
||||
plDesc.sampleCount = attKey.mtlSampleCount;
|
||||
plDesc.inputPrimitiveTopologyMVK = MTLPrimitiveTopologyClassTriangle;
|
||||
|
||||
for (uint32_t caIdx = 0; caIdx < kMVKClearAttachmentDepthStencilIndex; caIdx++) {
|
||||
for (uint32_t caIdx = 0; caIdx < kMVKClearColorAttachmentCount; caIdx++) {
|
||||
MTLRenderPipelineColorAttachmentDescriptor* colorDesc = plDesc.colorAttachments[caIdx];
|
||||
colorDesc.pixelFormat = (MTLPixelFormat)attKey.attachmentMTLPixelFormats[caIdx];
|
||||
colorDesc.writeMask = attKey.isAttachmentEnabled(caIdx) ? MTLColorWriteMaskAll : MTLColorWriteMaskNone;
|
||||
}
|
||||
MVKPixelFormats* pixFmts = getPixelFormats();
|
||||
MTLPixelFormat mtlDSFormat = (MTLPixelFormat)attKey.attachmentMTLPixelFormats[kMVKClearAttachmentDepthStencilIndex];
|
||||
if (pixFmts->isDepthFormat(mtlDSFormat)) { plDesc.depthAttachmentPixelFormat = mtlDSFormat; }
|
||||
if (pixFmts->isStencilFormat(mtlDSFormat)) { plDesc.stencilAttachmentPixelFormat = mtlDSFormat; }
|
||||
|
||||
MTLPixelFormat mtlDepthFormat = (MTLPixelFormat)attKey.attachmentMTLPixelFormats[kMVKClearAttachmentDepthIndex];
|
||||
if (pixFmts->isDepthFormat(mtlDepthFormat)) { plDesc.depthAttachmentPixelFormat = mtlDepthFormat; }
|
||||
|
||||
MTLPixelFormat mtlStencilFormat = (MTLPixelFormat)attKey.attachmentMTLPixelFormats[kMVKClearAttachmentStencilIndex];
|
||||
if (pixFmts->isStencilFormat(mtlStencilFormat)) { plDesc.stencilAttachmentPixelFormat = mtlStencilFormat; }
|
||||
|
||||
MTLVertexDescriptor* vtxDesc = plDesc.vertexDescriptor;
|
||||
|
||||
@ -273,7 +277,7 @@ id<MTLFunction> MVKCommandResourceFactory::newBlitFragFunction(MVKRPSKeyBlitImg&
|
||||
[msl appendLineMVK: @" return out;"];
|
||||
[msl appendLineMVK: @"}"];
|
||||
|
||||
// MVKLogDebug("\n%s", msl.UTF8String);
|
||||
// MVKLogInfo("\n%s", msl.UTF8String);
|
||||
|
||||
return newMTLFunction(msl, funcName);
|
||||
}
|
||||
@ -300,15 +304,16 @@ id<MTLFunction> MVKCommandResourceFactory::newClearVertFunction(MVKRPSKeyClearAt
|
||||
[msl appendLineMVK];
|
||||
|
||||
NSString* funcName = @"vertClear";
|
||||
[msl appendFormat: @"vertex VaryingsPos %@(AttributesPos attributes [[stage_in]], constant ClearColorsIn& ccIn [[buffer(0)]]) {", funcName];
|
||||
[msl appendFormat: @"vertex VaryingsPos %@(AttributesPos attributes [[stage_in]], constant ClearColorsIn& ccIn [[buffer(0)]]) {", funcName];
|
||||
[msl appendLineMVK];
|
||||
[msl appendLineMVK: @" VaryingsPos varyings;"];
|
||||
[msl appendLineMVK: @" varyings.v_position = float4(attributes.a_position.x, -attributes.a_position.y, ccIn.colors[8].r, 1.0);"];
|
||||
[msl appendFormat: @" varyings.v_position = float4(attributes.a_position.x, -attributes.a_position.y, ccIn.colors[%d].r, 1.0);", kMVKClearAttachmentDepthIndex];
|
||||
[msl appendLineMVK];
|
||||
[msl appendLineMVK: @" varyings.layer = uint(attributes.a_position.w);"];
|
||||
[msl appendLineMVK: @" return varyings;"];
|
||||
[msl appendLineMVK: @"}"];
|
||||
|
||||
// MVKLogDebug("\n%s", msl.UTF8String);
|
||||
// MVKLogInfo("\n%s", msl.UTF8String);
|
||||
|
||||
return newMTLFunction(msl, funcName);
|
||||
}
|
||||
@ -329,7 +334,7 @@ id<MTLFunction> MVKCommandResourceFactory::newClearFragFunction(MVKRPSKeyClearAt
|
||||
[msl appendLineMVK: @"} ClearColorsIn;"];
|
||||
[msl appendLineMVK];
|
||||
[msl appendLineMVK: @"typedef struct {"];
|
||||
for (uint32_t caIdx = 0; caIdx < kMVKClearAttachmentDepthStencilIndex; caIdx++) {
|
||||
for (uint32_t caIdx = 0; caIdx < kMVKClearColorAttachmentCount; caIdx++) {
|
||||
if (attKey.isAttachmentUsed(caIdx)) {
|
||||
NSString* typeStr = getMTLFormatTypeString((MTLPixelFormat)attKey.attachmentMTLPixelFormats[caIdx]);
|
||||
[msl appendFormat: @" %@4 color%u [[color(%u)]];", typeStr, caIdx, caIdx];
|
||||
@ -343,7 +348,7 @@ id<MTLFunction> MVKCommandResourceFactory::newClearFragFunction(MVKRPSKeyClearAt
|
||||
[msl appendFormat: @"fragment ClearColorsOut %@(VaryingsPos varyings [[stage_in]], constant ClearColorsIn& ccIn [[buffer(0)]]) {", funcName];
|
||||
[msl appendLineMVK];
|
||||
[msl appendLineMVK: @" ClearColorsOut ccOut;"];
|
||||
for (uint32_t caIdx = 0; caIdx < kMVKClearAttachmentDepthStencilIndex; caIdx++) {
|
||||
for (uint32_t caIdx = 0; caIdx < kMVKClearColorAttachmentCount; caIdx++) {
|
||||
if (attKey.isAttachmentUsed(caIdx)) {
|
||||
NSString* typeStr = getMTLFormatTypeString((MTLPixelFormat)attKey.attachmentMTLPixelFormats[caIdx]);
|
||||
[msl appendFormat: @" ccOut.color%u = %@4(ccIn.colors[%u]);", caIdx, typeStr, caIdx];
|
||||
@ -353,7 +358,7 @@ id<MTLFunction> MVKCommandResourceFactory::newClearFragFunction(MVKRPSKeyClearAt
|
||||
[msl appendLineMVK: @" return ccOut;"];
|
||||
[msl appendLineMVK: @"}"];
|
||||
|
||||
// MVKLogDebug("\n%s", msl.UTF8String);
|
||||
// MVKLogInfo("\n%s", msl.UTF8String);
|
||||
|
||||
return newMTLFunction(msl, funcName);
|
||||
}
|
||||
|
@ -80,8 +80,8 @@ const static uint32_t kMVKQueueFamilyCount = 4;
|
||||
const static uint32_t kMVKQueueCountPerQueueFamily = 1; // Must be 1. See comments in MVKPhysicalDevice::getQueueFamilies()
|
||||
const static uint32_t kMVKMinSwapchainImageCount = 2;
|
||||
const static uint32_t kMVKMaxSwapchainImageCount = 3;
|
||||
const static uint32_t kMVKCachedViewportScissorCount = 16;
|
||||
const static uint32_t kMVKCachedColorAttachmentCount = 8;
|
||||
const static uint32_t kMVKMaxColorAttachmentCount = 8;
|
||||
const static uint32_t kMVKMaxViewportScissorCount = 16;
|
||||
const static uint32_t kMVKMaxDescriptorSetCount = SPIRV_CROSS_NAMESPACE::kMaxArgumentBuffers;
|
||||
|
||||
#if !MVK_XCODE_12
|
||||
|
@ -2269,17 +2269,17 @@ void MVKPhysicalDevice::initFeatures() {
|
||||
void MVKPhysicalDevice::initLimits() {
|
||||
|
||||
#if MVK_TVOS
|
||||
_properties.limits.maxColorAttachments = kMVKCachedColorAttachmentCount;
|
||||
_properties.limits.maxColorAttachments = kMVKMaxColorAttachmentCount;
|
||||
#endif
|
||||
#if MVK_IOS
|
||||
if (supportsMTLFeatureSet(iOS_GPUFamily2_v1)) {
|
||||
_properties.limits.maxColorAttachments = kMVKCachedColorAttachmentCount;
|
||||
_properties.limits.maxColorAttachments = kMVKMaxColorAttachmentCount;
|
||||
} else {
|
||||
_properties.limits.maxColorAttachments = 4; // < kMVKCachedColorAttachmentCount
|
||||
_properties.limits.maxColorAttachments = 4; // < kMVKMaxColorAttachmentCount
|
||||
}
|
||||
#endif
|
||||
#if MVK_MACOS
|
||||
_properties.limits.maxColorAttachments = kMVKCachedColorAttachmentCount;
|
||||
_properties.limits.maxColorAttachments = kMVKMaxColorAttachmentCount;
|
||||
#endif
|
||||
|
||||
_properties.limits.maxFragmentOutputAttachments = _properties.limits.maxColorAttachments;
|
||||
@ -2309,7 +2309,7 @@ void MVKPhysicalDevice::initLimits() {
|
||||
float maxVPDim = max(_properties.limits.maxViewportDimensions[0], _properties.limits.maxViewportDimensions[1]);
|
||||
_properties.limits.viewportBoundsRange[0] = (-2.0 * maxVPDim);
|
||||
_properties.limits.viewportBoundsRange[1] = (2.0 * maxVPDim) - 1;
|
||||
_properties.limits.maxViewports = _features.multiViewport ? kMVKCachedViewportScissorCount : 1;
|
||||
_properties.limits.maxViewports = _features.multiViewport ? kMVKMaxViewportScissorCount : 1;
|
||||
|
||||
_properties.limits.maxImageDimension3D = _metalFeatures.maxTextureLayers;
|
||||
_properties.limits.maxImageArrayLayers = _metalFeatures.maxTextureLayers;
|
||||
|
@ -350,8 +350,8 @@ protected:
|
||||
VkPipelineRasterizationStateCreateInfo _rasterInfo;
|
||||
VkPipelineDepthStencilStateCreateInfo _depthStencilInfo;
|
||||
|
||||
MVKSmallVector<VkViewport, kMVKCachedViewportScissorCount> _viewports;
|
||||
MVKSmallVector<VkRect2D, kMVKCachedViewportScissorCount> _scissors;
|
||||
MVKSmallVector<VkViewport, kMVKMaxViewportScissorCount> _viewports;
|
||||
MVKSmallVector<VkRect2D, kMVKMaxViewportScissorCount> _scissors;
|
||||
MVKSmallVector<VkDynamicState> _dynamicState;
|
||||
MVKSmallVector<MTLSamplePosition> _customSamplePositions;
|
||||
MVKSmallVector<MVKTranslatedVertexBinding> _translatedVertexBindings;
|
||||
|
Loading…
x
Reference in New Issue
Block a user