src/ngfx/porting/metal/MTLRenderPass.mm
Source code
/*
* Copyright 2020 GoPro Inc.
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
#include "ngfx/porting/metal/MTLRenderPass.h"
#include "ngfx/porting/metal/MTLGraphicsContext.h"
#include "ngfx/porting/metal/MTLSurface.h"
using namespace ngfx;
using namespace std;
MTLRenderPassDescriptor* MTLRenderPass::getDescriptor(MTLGraphicsContext* mtlCtx, MTLFramebuffer* mtlFramebuffer,
glm::vec4 clearColor, float clearDepth, uint32_t clearStencil) {
MTLRenderPassDescriptor* mtlRenderPassDescriptor = nullptr;
vector<MTLRenderPassColorAttachmentDescriptor*> colorAttachments;
if (mtlFramebuffer->colorAttachments.empty()) {
MTLSurface *surface = (MTLSurface*)mtlCtx->surface;
NSView *view = surface->view;
MTKView *mtkView = nullptr;
if ([view class] == [MTKView class]) {
mtkView = (MTKView*)view;
}
if (mtkView) {
mtlRenderPassDescriptor = mtkView.currentRenderPassDescriptor;
colorAttachments.push_back(mtlRenderPassDescriptor.colorAttachments[0]);
}
else {
mtlRenderPassDescriptor = [MTLRenderPassDescriptor renderPassDescriptor];
auto colorAttachment = mtlRenderPassDescriptor.colorAttachments[0];
colorAttachment.texture = surface->drawable.texture;
colorAttachments.push_back(colorAttachment);
auto depthAttachment = mtlRenderPassDescriptor.depthAttachment;
depthAttachment.texture = surface->depthStencilTexture.get()->v;
auto stencilAttachment = mtlRenderPassDescriptor.stencilAttachment;
stencilAttachment.texture = surface->depthStencilTexture.get()->v;
}
} else {
mtlRenderPassDescriptor = [MTLRenderPassDescriptor renderPassDescriptor];
for (uint32_t j = 0; j<mtlFramebuffer->colorAttachments.size(); j++) {
auto colorAttachment = mtlRenderPassDescriptor.colorAttachments[j];
auto& fbColorAttachment = mtlFramebuffer->colorAttachments[j];
colorAttachment.texture = fbColorAttachment.texture;
colorAttachment.resolveTexture = fbColorAttachment.resolveTexture;
colorAttachment.slice = fbColorAttachment.slice;
colorAttachment.level = fbColorAttachment.level;
colorAttachment.resolveSlice = fbColorAttachment.resolveSlice;
colorAttachment.resolveLevel = fbColorAttachment.resolveLevel;
colorAttachments.push_back(colorAttachment);
}
}
for (auto& colorAttachment : colorAttachments) {
colorAttachment.clearColor = { clearColor[0], clearColor[1], clearColor[2], clearColor[3] };
colorAttachment.loadAction = MTLLoadActionClear;
if (colorAttachment.resolveTexture)
colorAttachment.storeAction = MTLStoreActionStoreAndMultisampleResolve;
else colorAttachment.storeAction = MTLStoreActionStore;
}
auto depthAttachment = mtlRenderPassDescriptor.depthAttachment;
if (mtlFramebuffer->depthAttachment) {
depthAttachment.clearDepth = clearDepth;
depthAttachment.loadAction = MTLLoadActionClear;
depthAttachment.resolveTexture = mtlFramebuffer->depthAttachment.resolveTexture;
depthAttachment.texture = mtlFramebuffer->depthAttachment.texture;
if (depthAttachment.resolveTexture) depthAttachment.storeAction = MTLStoreActionMultisampleResolve;
else depthAttachment.storeAction = MTLStoreActionDontCare;
}
auto stencilAttachment = mtlRenderPassDescriptor.stencilAttachment;
if (mtlFramebuffer->stencilAttachment) {
stencilAttachment.texture = mtlFramebuffer->stencilAttachment.texture;
}
if (mtlRenderPassDescriptor.stencilAttachment) mtlRenderPassDescriptor.stencilAttachment.clearStencil = clearStencil;
return mtlRenderPassDescriptor;
}
Updated on 3 April 2021 at 20:21:51 PDT