diff --git a/src/graphics/host_gpu/renderer/renderCompute.cpp b/src/graphics/host_gpu/renderer/renderCompute.cpp index 8efe81627..e7e2f0ada 100644 --- a/src/graphics/host_gpu/renderer/renderCompute.cpp +++ b/src/graphics/host_gpu/renderer/renderCompute.cpp @@ -272,68 +272,6 @@ void RenderExecutor::DispatchDirect(uint64_t submit_id, CommandBuffer& buffer, return; } - const bool large_workgroup = - (input_info.threads_num[0] * input_info.threads_num[1] * input_info.threads_num[2] >= 512); - const bool has_sampler = !program.info.samplers.empty(); - static std::atomic dispatch_log_count {0}; - if ((large_workgroup || has_sampler) && - dispatch_log_count.fetch_add(1, std::memory_order_relaxed) < 512) { - const auto sampled_images = std::count_if( - program.info.images.begin(), program.info.images.end(), [](const auto& image) { - return image.resource_class == ShaderRecompiler::IR::ImageResourceClass::Sampled; - }); - const uint32_t frame_num = static_cast(m_context.GetGpu().GetFrameNum()); - LOGF("GraphicsRenderDispatchDirect: frame=%u shader=0x%016" PRIx64 - " groups=%ux%ux%u mode=0x%08" PRIx32 " local=%ux%ux%u " - "buffers=%zu textures=%zu sampled=%zu storage=%zu samplers=%zu push=%u\n", - frame_num, sh_ctx.GetCs().cs_regs.data_addr, thread_group_x, thread_group_y, - thread_group_z, mode, input_info.threads_num[0], input_info.threads_num[1], - input_info.threads_num[2], program.info.buffers.size(), program.info.images.size(), - sampled_images, program.info.images.size() - sampled_images, - program.info.samplers.size(), - program.bindings.UsesPushData() - ? static_cast(sizeof(ShaderRecompiler::IR::PushData)) - : 0u); - for (uint32_t i = 0; i < program.info.buffers.size(); i++) { - const auto& buffer = program.info.buffers[i]; - const auto r = DecodeNativeDescriptor(resources.buffers[i]); - LOGF(" CS buffer[%u]: source=%u usage=%s addr=0x%012" PRIx64 - " stride=%u records=%u format=%u\n", - i, buffer.source, buffer.written ? "read-write" : "read-only", r.Base48(), - r.Stride(), r.NumRecords(), r.RawFormat()); - } - for (uint32_t i = 0; i < program.info.images.size(); i++) { - const auto& image = program.info.images[i]; - const auto r = DecodeNativeDescriptor(resources.images[i]); - LOGF(" CS texture[%u]: source=%u usage=%s sampled=%s addr=0x%010" PRIx64 - " type=%u fmt=%u extent=%ux%u depth=%u levels=%u tile=%u\n", - i, image.source, image.written ? "read-write" : "read-only", - image.resource_class == ShaderRecompiler::IR::ImageResourceClass::Sampled - ? "true" - : "false", - r.Base40(), static_cast(r.Type()), static_cast(r.Format()), - static_cast(r.Width5()) + 1u, static_cast(r.Height5()) + 1u, - static_cast(r.Depth()) + 1u, - r.Type() == Prospero::ImageType::kColor2DMsaa || - r.Type() == Prospero::ImageType::kColor2DMsaaArray - ? 1u - : static_cast(image.r128 ? r.LastLevel() : r.MaxMip()) + 1u, - static_cast(r.TileMode())); - } - for (uint32_t i = 0; i < program.info.samplers.size(); i++) { - const auto r = DecodeNativeDescriptor( - resources.samplers[program.info.samplers[i].snapshot_index]); - LOGF(" CS sampler[%u]: source=%u clamp=%u/%u/%u filter=%u/%u/%u mip=%u " - "lod=%u-%u bias=%d\n", - i, program.info.samplers[i].source, static_cast(r.ClampX()), - static_cast(r.ClampY()), static_cast(r.ClampZ()), - static_cast(r.XyMagFilter()), static_cast(r.XyMinFilter()), - static_cast(r.ZFilter()), static_cast(r.MipFilter()), - static_cast(r.MinLod()), static_cast(r.MaxLod()), - static_cast(r.LodBias())); - } - } - if (use_thread_dimensions) { auto groups_from_threads = [](uint32_t threads, uint32_t group_size) { return (threads == 0 @@ -389,6 +327,66 @@ void RenderExecutor::DispatchDirect(uint64_t submit_id, CommandBuffer& buffer, // while allowing the queue to execute asynchronously. ShaderWriteHazardBarrier(vk_buffer, vk::PipelineStageFlagBits::eComputeShader); } + if (Config::GraphicsDebugDumpEnabled()) { + const auto sampled_images = std::count_if( + program.info.images.begin(), program.info.images.end(), [](const auto& image) { + return image.resource_class == ShaderRecompiler::IR::ImageResourceClass::Sampled; + }); + const uint32_t frame_num = static_cast(m_context.GetGpu().GetFrameNum()); + LOGF("GraphicsRenderDispatchDirect: frame=%u shader=0x%016" PRIx64 + " hash=0x%016" PRIx64 " tick=%" PRIu64 + " groups=%ux%ux%u mode=0x%08" PRIx32 " local=%ux%ux%u " + "buffers=%zu textures=%zu sampled=%zu storage=%zu samplers=%zu push=%u\n", + frame_num, sh_ctx.GetCs().cs_regs.data_addr, program.shader_hash, + m_context.GetCommandScheduler().CurrentTick(), + thread_group_x, thread_group_y, thread_group_z, mode, + input_info.threads_num[0], input_info.threads_num[1], + input_info.threads_num[2], program.info.buffers.size(), program.info.images.size(), + sampled_images, program.info.images.size() - sampled_images, + program.info.samplers.size(), + program.bindings.UsesPushData() + ? static_cast(sizeof(ShaderRecompiler::IR::PushData)) + : 0u); + for (uint32_t i = 0; i < program.info.buffers.size(); i++) { + const auto& buffer = program.info.buffers[i]; + const auto r = DecodeNativeDescriptor(resources.buffers[i]); + LOGF(" CS buffer[%u]: source=%u usage=%s addr=0x%012" PRIx64 + " stride=%u records=%u format=%u\n", + i, buffer.source, buffer.written ? "read-write" : "read-only", r.Base48(), + r.Stride(), r.NumRecords(), r.RawFormat()); + } + for (uint32_t i = 0; i < program.info.images.size(); i++) { + const auto& image = program.info.images[i]; + const auto r = DecodeNativeDescriptor(resources.images[i]); + LOGF(" CS texture[%u]: source=%u usage=%s sampled=%s addr=0x%010" PRIx64 + " type=%u fmt=%u extent=%ux%u depth=%u levels=%u tile=%u\n", + i, image.source, image.written ? "read-write" : "read-only", + image.resource_class == ShaderRecompiler::IR::ImageResourceClass::Sampled + ? "true" + : "false", + r.Base40(), static_cast(r.Type()), static_cast(r.Format()), + static_cast(r.Width5()) + 1u, static_cast(r.Height5()) + 1u, + static_cast(r.Depth()) + 1u, + r.Type() == Prospero::ImageType::kColor2DMsaa || + r.Type() == Prospero::ImageType::kColor2DMsaaArray + ? 1u + : static_cast(image.r128 ? r.LastLevel() : r.MaxMip()) + 1u, + static_cast(r.TileMode())); + } + for (uint32_t i = 0; i < program.info.samplers.size(); i++) { + const auto r = DecodeNativeDescriptor( + resources.samplers[program.info.samplers[i].snapshot_index]); + LOGF(" CS sampler[%u]: source=%u clamp=%u/%u/%u filter=%u/%u/%u mip=%u " + "lod=%u-%u bias=%d\n", + i, program.info.samplers[i].source, static_cast(r.ClampX()), + static_cast(r.ClampY()), static_cast(r.ClampZ()), + static_cast(r.XyMagFilter()), static_cast(r.XyMinFilter()), + static_cast(r.ZFilter()), static_cast(r.MipFilter()), + static_cast(r.MinLod()), static_cast(r.MaxLod()), + static_cast(r.LodBias())); + } + } + vk_buffer.bindPipeline(vk::PipelineBindPoint::eCompute, pipeline.pipeline); vk_buffer.dispatch(thread_group_x, thread_group_y, thread_group_z);