diff --git a/src/d3d11/d3d11_context_impl.cpp b/src/d3d11/d3d11_context_impl.cpp index 7736338e..40d3b0cf 100644 --- a/src/d3d11/d3d11_context_impl.cpp +++ b/src/d3d11/d3d11_context_impl.cpp @@ -3289,7 +3289,7 @@ template class MTLD3D11DeviceContextImplBase : p renderPassDescriptor->setRenderTargetArrayLength(render_target_array); - ctx.startRenderPass(std::move(renderPassDescriptor), dsv_planar_flags); + ctx.startRenderPass(std::move(renderPassDescriptor), dsv_planar_flags, rtvs.size()); }); } diff --git a/src/dxmt/dxmt_context.cpp b/src/dxmt/dxmt_context.cpp index 84bb4bfd..63332f46 100644 --- a/src/dxmt/dxmt_context.cpp +++ b/src/dxmt/dxmt_context.cpp @@ -333,13 +333,16 @@ ArgumentEncodingContext::present(Rc &texture, CA::MetalDrawable *drawab } RenderEncoderData * -ArgumentEncodingContext::startRenderPass(Obj &&descriptor, uint32_t dsv_planar_flags) { +ArgumentEncodingContext::startRenderPass( + Obj &&descriptor, uint32_t dsv_planar_flags, uint32_t render_target_count +) { assert(!encoder_current); auto encoder_info = allocate(); encoder_info->type = EncoderType::Render; encoder_info->id = nextEncoderId(); encoder_info->descriptor = std::move(descriptor); encoder_info->dsv_planar_flags = dsv_planar_flags; + encoder_info->render_target_count = render_target_count; encoder_current = encoder_info; vro_state_.beginEncoder(); @@ -649,7 +652,7 @@ ArgumentEncodingContext::checkEncoderRelation(EncoderData *former, EncoderData * clear->type = EncoderType::Null; return DXMT_ENCODER_LIST_OP_COALESCE; } else { - for (unsigned i = 0; i < 8 /* FIXME: optimize constant */; i++) { + for (unsigned i = 0; i < render->render_target_count; i++) { auto attachment = render->descriptor->colorAttachments()->object(i); if (attachment->texture() == clear->texture.ptr() && attachment->loadAction() == MTL::LoadActionLoad) { attachment->setLoadAction(MTL::LoadActionClear); diff --git a/src/dxmt/dxmt_context.hpp b/src/dxmt/dxmt_context.hpp index e4155fa9..a65d095e 100644 --- a/src/dxmt/dxmt_context.hpp +++ b/src/dxmt/dxmt_context.hpp @@ -103,10 +103,9 @@ struct RenderEncoderData : EncoderData { CommandList cmds; CommandList pretess_cmds; uint32_t dsv_planar_flags; + uint32_t render_target_count = 0; bool use_visibility_result = 0; bool use_tessellation = 0; - bool coalesced_start = 0; - bool coalesced_end = 0; }; struct ComputeCommandContext { @@ -117,8 +116,6 @@ struct ComputeCommandContext { struct ComputeEncoderData : EncoderData { CommandList cmds; - bool coalesced_start; - bool coalesced_end; }; struct BlitCommandContext { @@ -463,7 +460,8 @@ class ArgumentEncodingContext { ); void resolveTexture(Rc &&src, unsigned srcSlice, Rc &&dst, unsigned dstSlice, unsigned dstLevel); - RenderEncoderData *startRenderPass(Obj &&descriptor, uint32_t dsv_planar_flags); + RenderEncoderData * + startRenderPass(Obj &&descriptor, uint32_t dsv_planar_flags, uint32_t render_target_count); EncoderData *startComputePass(); EncoderData *startBlitPass();