18 renderPass->frameUpdate();
20 auto& beforePasses = renderPass->beforePasses();
21 for (
auto pass : beforePasses) {
22 if (pass->enabled()) {
27 if (renderPass->enabled()) {
28 _renderPasses.push_back(renderPass);
31 for (
auto pass : renderPass->afterPasses()) {
32 if (pass->enabled()) {
39 for (
auto renderPass : _renderPasses) {
40 RenderTarget* renderTarget = renderPass->renderTarget().get();
43 if (renderTarget !=
nullptr) {
45 if (
auto it = _renderTargetMap.find(renderTarget); it != _renderTargetMap.end()) {
46 auto prevPass = it->second;
49 const auto& colorArrayOps = renderPass->colorArrayOps();
50 size_t count = colorArrayOps.size();
51 for (
size_t j = 0; j < count; j++) {
52 const auto colorOps = colorArrayOps[j];
53 if (!colorOps->clear) {
54 prevPass->colorArrayOps()[j]->store =
true;
58 const auto depthStencilOps = renderPass->depthStencilOps();
59 if (!depthStencilOps->clearDepth) {
60 prevPass->depthStencilOps()->storeDepth =
true;
62 if (!depthStencilOps->clearStencil) {
63 prevPass->depthStencilOps()->storeStencil =
true;
68 _renderTargetMap[renderTarget] = renderPass;
73 if (_renderPasses.size() < 2)
return;
74 for (
size_t i = 0; i < _renderPasses.size() - 1; i++) {
75 auto firstPass = _renderPasses[i];
76 auto firstRT = firstPass->renderTarget();
77 auto secondPass = _renderPasses[i + 1];
78 auto secondRT = secondPass->renderTarget();
82 if (firstRT != secondRT || firstRT ==
nullptr) {
87 const auto secondDepthStencilOps = secondPass->depthStencilOps();
88 if (secondDepthStencilOps->clearDepth ||
89 secondDepthStencilOps->clearStencil) {
93 const auto& secondColorArrayOps = secondPass->colorArrayOps();
94 bool anyColorClear =
false;
95 for (
const auto& colorOps : secondColorArrayOps) {
96 if (colorOps->clear) {
106 if (firstPass->afterPasses().size() > 0) {
111 if (secondPass->beforePasses().size() > 0) {
116 firstPass->setSkipEnd(
true);
117 secondPass->setSkipStart(
true);
124 Texture* lastCubeTexture =
nullptr;
125 std::shared_ptr<RenderPass> lastCubeRenderPass =
nullptr;
127 for (
auto renderPass : _renderPasses) {
128 auto renderTarget = renderPass->renderTarget();
129 Texture* thisTexture = renderTarget ? renderTarget->colorBuffer() :
nullptr;
131 if (thisTexture && thisTexture->
isCubemap()) {
133 if (lastCubeTexture == thisTexture) {
134 auto& lastColorArrayOps = lastCubeRenderPass->colorArrayOps();
135 size_t count = lastColorArrayOps.size();
136 for (
size_t j = 0; j < count; j++) {
137 lastColorArrayOps[j]->genMipmaps =
false;
141 lastCubeTexture = renderTarget->colorBuffer();
142 lastCubeRenderPass = renderPass;
143 }
else if (renderPass->requiresCubemaps()) {
145 lastCubeTexture =
nullptr;
146 lastCubeRenderPass =
nullptr;
150 _renderTargetMap.clear();
GPU texture resource supporting 2D, cubemap, volume, and array formats with mipmap management.