diff --git a/src/graphics/host_gpu/renderer/cache/bufferCache.cpp b/src/graphics/host_gpu/renderer/cache/bufferCache.cpp index c7b61b96..aa4071ff 100644 --- a/src/graphics/host_gpu/renderer/cache/bufferCache.cpp +++ b/src/graphics/host_gpu/renderer/cache/bufferCache.cpp @@ -193,17 +193,16 @@ void BufferCache::DownloadBufferMemory(std::span copies) { BufferCache::BufferCache(GraphicContext& graphics, CommandScheduler& scheduler, PageManager& page_manager, TextureCache& texture_cache) - : m_graphics(graphics), m_scheduler(scheduler), - m_fault_manager(graphics, scheduler, *this, CACHING_PAGEBITS, CACHING_NUMPAGES), - m_gds_buffer(graphics, scheduler, MemoryUsage::Stream, 0, AllFlags, GdsBufferSize), - m_bda_pagetable_buffer(graphics, scheduler, MemoryUsage::DeviceLocal, 0, AllFlags, - BDA_PAGETABLE_SIZE), - m_memory_tracker(page_manager), - m_staging_buffer(graphics, scheduler, MemoryUsage::Upload, 512 * MiB), - m_stream_buffer(graphics, scheduler, MemoryUsage::Stream, 64 * MiB), - m_download_buffer(graphics, scheduler, MemoryUsage::Download, 32 * MiB), - m_device_buffer(graphics, scheduler, MemoryUsage::DeviceLocal, 128 * MiB), - m_texture_cache(texture_cache) { + : m_graphics(graphics), m_scheduler(scheduler), m_fault_manager(graphics, scheduler, *this), + m_gds_buffer(graphics, scheduler, MemoryUsage::Stream, 0, AllFlags, GdsBufferSize), + m_bda_pagetable_buffer(graphics, scheduler, MemoryUsage::DeviceLocal, 0, AllFlags, + BDA_PAGETABLE_SIZE), + m_memory_tracker(page_manager), + m_staging_buffer(graphics, scheduler, MemoryUsage::Upload, 512 * MiB), + m_stream_buffer(graphics, scheduler, MemoryUsage::Stream, 64 * MiB), + m_download_buffer(graphics, scheduler, MemoryUsage::Download, 32 * MiB), + m_device_buffer(graphics, scheduler, MemoryUsage::DeviceLocal, 128 * MiB), + m_texture_cache(texture_cache) { std::memset(m_gds_buffer.Mapped().data(), 0, static_cast(m_gds_buffer.Size())); m_gds_buffer.Flush(0, m_gds_buffer.Size()); SetVulkanObjectNameF(m_graphics.device, m_bda_pagetable_buffer.Handle(), diff --git a/src/graphics/host_gpu/renderer/cache/faultManager.cpp b/src/graphics/host_gpu/renderer/cache/faultManager.cpp index fe7a10c6..c40b54e8 100644 --- a/src/graphics/host_gpu/renderer/cache/faultManager.cpp +++ b/src/graphics/host_gpu/renderer/cache/faultManager.cpp @@ -23,13 +23,10 @@ constexpr size_t PageFaultAreaSize = MaxPageFaults * sizeof(uint64_t); } // namespace FaultManager::FaultManager(GraphicContext& graphics, CommandScheduler& scheduler, - BufferCache& buffer_cache, uint32_t caching_pagebits, - uint64_t caching_num_pages) + BufferCache& buffer_cache) : m_graphics(graphics), m_scheduler(scheduler), m_buffer_cache(buffer_cache), - m_caching_pagesize(uint64_t {1} << caching_pagebits), - m_caching_num_pages(caching_num_pages), m_fault_buffer_size(caching_num_pages / 8), m_fault_buffer(graphics, scheduler, MemoryUsage::DeviceLocal, 0, AllFlags, - m_fault_buffer_size), + BufferCache::CACHING_NUMPAGES / 8), m_download_buffer(graphics, scheduler, MemoryUsage::Download, 0, AllFlags, MaxPendingFaults * PageFaultAreaSize) { SetVulkanObjectNameF(m_graphics.device, m_fault_buffer.Handle(), "Fault Buffer"); @@ -100,7 +97,7 @@ void FaultManager::ProcessFaultBuffer() { pre_barrier.dstAccessMask = vk::AccessFlagBits2::eShaderRead; pre_barrier.buffer = m_fault_buffer.Handle(); pre_barrier.offset = 0; - pre_barrier.size = m_fault_buffer_size; + pre_barrier.size = m_fault_buffer.Size(); auto post_barrier = pre_barrier; post_barrier.srcStageMask = vk::PipelineStageFlagBits2::eComputeShader; post_barrier.srcAccessMask = vk::AccessFlagBits2::eShaderWrite; @@ -108,7 +105,7 @@ void FaultManager::ProcessFaultBuffer() { post_barrier.dstAccessMask = vk::AccessFlagBits2::eShaderWrite; const vk::DescriptorBufferInfo infos[] { - {m_fault_buffer.Handle(), 0, m_fault_buffer_size}, + {m_fault_buffer.Handle(), 0, m_fault_buffer.Size()}, {m_download_buffer.Handle(), offset, PageFaultAreaSize}, }; std::array writes {}; @@ -129,7 +126,7 @@ void FaultManager::ProcessFaultBuffer() { command.bindPipeline(vk::PipelineBindPoint::eCompute, m_fault_process_pipeline); command.pushDescriptorSetKHR(vk::PipelineBindPoint::eCompute, m_fault_process_pipeline_layout, 0, writes); - const auto num_threads = m_caching_num_pages / 32; + const auto num_threads = BufferCache::CACHING_NUMPAGES / 32; const auto num_workgroups = (num_threads + 63) / 64; command.dispatch(static_cast(num_workgroups), 1, 1); dependency.pBufferMemoryBarriers = &post_barrier; @@ -138,14 +135,14 @@ void FaultManager::ProcessFaultBuffer() { const auto area = m_current_area; m_scheduler.DeferOperation([this, mapped, offset, area] { m_download_buffer.Invalidate(offset, PageFaultAreaSize); - m_fault_ranges.Clear(); + RangeSet fault_ranges; const auto* faults = std::bit_cast(mapped); const auto count = static_cast(faults[0]); for (uint32_t index = 1; index <= count; ++index) { - m_fault_ranges.Add(faults[index], m_caching_pagesize); + fault_ranges.Add(faults[index], BufferCache::CACHING_PAGESIZE); LOGF("Accessed non-GPU cached memory at 0x%016" PRIx64 "\n", faults[index]); } - m_fault_ranges.ForEach([this](uint64_t start, uint64_t end) { + fault_ranges.ForEach([this](uint64_t start, uint64_t end) { EXIT_IF(end - start > std::numeric_limits::max()); (void)m_buffer_cache.FindBuffer(start, end - start); }); diff --git a/src/graphics/host_gpu/renderer/cache/faultManager.h b/src/graphics/host_gpu/renderer/cache/faultManager.h index 73c2fe70..86dde243 100644 --- a/src/graphics/host_gpu/renderer/cache/faultManager.h +++ b/src/graphics/host_gpu/renderer/cache/faultManager.h @@ -2,7 +2,6 @@ #define EMULATOR_SRC_GRAPHICS_HOST_GPU_RENDERER_CACHE_FAULTMANAGER_H_ #include "common/abi.h" -#include "graphics/host_gpu/rangeSet.h" #include "graphics/host_gpu/renderer/cache/streamBuffer.h" #include @@ -16,8 +15,7 @@ class FaultManager { static constexpr size_t MaxPendingFaults = 8; public: - FaultManager(GraphicContext& graphics, CommandScheduler& scheduler, BufferCache& buffer_cache, - uint32_t caching_pagebits, uint64_t caching_num_pages); + FaultManager(GraphicContext& graphics, CommandScheduler& scheduler, BufferCache& buffer_cache); ~FaultManager(); KYTY_CLASS_NO_COPY(FaultManager); @@ -28,10 +26,6 @@ private: GraphicContext& m_graphics; CommandScheduler& m_scheduler; BufferCache& m_buffer_cache; - RangeSet m_fault_ranges; - uint64_t m_caching_pagesize; - uint64_t m_caching_num_pages; - uint64_t m_fault_buffer_size; Buffer m_fault_buffer; Buffer m_download_buffer; std::array m_fault_areas {}; diff --git a/src/graphics/host_gpu/renderer/cache/multiLevelPageTable.h b/src/graphics/host_gpu/renderer/cache/multiLevelPageTable.h index 001e3aa6..7fac1d8e 100644 --- a/src/graphics/host_gpu/renderer/cache/multiLevelPageTable.h +++ b/src/graphics/host_gpu/renderer/cache/multiLevelPageTable.h @@ -256,17 +256,6 @@ private: size_type m_inline_size = 0; }; -// Removes only the requested owner. Other owners in the same page entry remain intact. -template -[[nodiscard]] bool EraseExact(Container& owners, const Value& owner) { - const auto it = std::find(owners.begin(), owners.end(), owner); - if (it == owners.end()) { - return false; - } - owners.erase(it); - return true; -} - } // namespace Libs::Graphics #endif // EMULATOR_SRC_GRAPHICS_HOST_GPU_RENDERER_MULTILEVELPAGETABLE_H_ diff --git a/src/graphics/host_gpu/renderer/cache/textureCache.cpp b/src/graphics/host_gpu/renderer/cache/textureCache.cpp index 6e00edb2..8b9abc66 100644 --- a/src/graphics/host_gpu/renderer/cache/textureCache.cpp +++ b/src/graphics/host_gpu/renderer/cache/textureCache.cpp @@ -62,6 +62,36 @@ void NameImageBinding(GraphicContext& graphics, Image& image, vk::ImageView view view_info.level_count, view_info.base_layer, view_info.layer_count); } +[[nodiscard]] std::vector BuildDepthCopies(const ImageInfo& info, + uint64_t slice_stride) { + std::vector copies(info.resources.layers); + for (uint32_t layer = 0; layer < info.resources.layers; ++layer) { + auto& copy = copies[layer]; + copy.bufferOffset = slice_stride * layer; + copy.bufferRowLength = info.pitch; + copy.bufferImageHeight = info.extent.height; + copy.imageSubresource = {vk::ImageAspectFlagBits::eDepth, 0, layer, 1}; + copy.imageExtent = {info.extent.width, info.extent.height, 1}; + } + return copies; +} + +[[nodiscard]] std::vector BuildDepthTiles(const ImageInfo& info) { + TileBlockLayout block {}; + EXIT_NOT_IMPLEMENTED( + !TileGetBlockLayout(TileBlockFamily::Depth64KB, info.bytes_per_block, block)); + const auto full_slice_size = info.data.size / info.resources.layers; + std::vector tiles; + tiles.reserve(info.resources.layers); + for (uint32_t layer = 0; layer < info.resources.layers; ++layer) { + const auto offset = full_slice_size * layer; + tiles.push_back({block.family, block.bytes_per_element, offset, full_slice_size, offset, + full_slice_size, 0, info.extent.width, info.extent.height, 1, info.pitch}); + tiles.back().surface_z = layer; + } + return tiles; +} + } // namespace TextureCache::TextureCache(GraphicContext& graphics, CommandScheduler& scheduler, @@ -825,18 +855,17 @@ struct TextureCache::TextureTransferPlan { TextureUploadLayout layout; std::vector regions; std::vector tiles; - uint64_t linear_size = 0; bool swap_bgra16 = false; bool valid = false; -}; -static uint64_t GetLinearSize(std::span tiles) { - uint64_t size = 0; - for (const auto& tile: tiles) { - size = std::max(size, tile.linear_offset + tile.linear_size); + [[nodiscard]] uint64_t LinearSize() const { + uint64_t size = 0; + for (const auto& tile: tiles) { + size = std::max(size, tile.linear_offset + tile.linear_size); + } + return size; } - return size; -} +}; struct TextureCache::DownloadPlan { TextureTransferPlan texture; @@ -902,7 +931,6 @@ TextureCache::BuildTextureTransfer(const Image& image, BindingType binding, info.resources.levels, plan.tiles)) { return plan; } - plan.linear_size = GetLinearSize(plan.tiles); } plan.valid = true; return plan; @@ -954,7 +982,7 @@ void TextureCache::UploadImage(Image& image, Buffer& source, uint64_t source_off TileManager::Result linear {source.Handle(), source_offset, info.data.size}; if (!plan.tiles.empty()) { linear = m_tiler.Detile(source.Handle(), source_offset, info.data.size, - plan.linear_size, plan.tiles); + plan.LinearSize(), plan.tiles); } if (plan.swap_bgra16) { linear = m_tiler.SwapBgra16(linear); @@ -968,31 +996,12 @@ void TextureCache::UploadImage(Image& image, Buffer& source, uint64_t source_off Prospero::NumBytesPerElement(info.guest_format) != info.bytes_per_block) { EXIT("TextureCache: invalid depth upload\n"); } - TileBlockLayout block {}; - EXIT_NOT_IMPLEMENTED( - !TileGetBlockLayout(TileBlockFamily::Depth64KB, info.bytes_per_block, block)); - const auto layers = info.resources.layers; - const auto full_slice_size = info.data.size / layers; - std::vector tiles; - std::vector copies(layers); - tiles.reserve(layers); - for (uint32_t layer = 0; layer < layers; layer++) { - const uint64_t offset = full_slice_size * layer; - auto& copy = copies[layer]; - copy.bufferOffset = offset; - copy.bufferRowLength = info.pitch; - copy.bufferImageHeight = info.extent.height; - copy.imageSubresource = {vk::ImageAspectFlagBits::eDepth, 0, layer, 1}; - copy.imageExtent = {info.extent.width, info.extent.height, 1}; - if (info.tile_mode != Prospero::TileMode::kLinear) { - tiles.push_back({block.family, block.bytes_per_element, offset, full_slice_size, offset, - full_slice_size, 0, info.extent.width, info.extent.height, 1, - info.pitch}); - tiles.back().surface_z = layer; - } - } + const auto layers = info.resources.layers; + const auto full_slice_size = info.data.size / layers; + auto copies = BuildDepthCopies(info, full_slice_size); TileManager::Result linear {source.Handle(), source_offset, source.Size() - source_offset}; - if (!tiles.empty()) { + if (info.IsTiled()) { + const auto tiles = BuildDepthTiles(info); linear = m_tiler.Detile(source.Handle(), source_offset, info.data.size, info.data.size, tiles); } @@ -1101,7 +1110,7 @@ void TextureCache::AssociateStencil(ImageId depth_id, GuestRange stencil) { } auto& record = m_slot_images[association]; TouchImage(record); - record.AssociateDepth(depth_id); + record.depth_id = depth_id; } ImageId TextureCache::FindImage(ImageDesc& desc, bool exact_format) { @@ -1470,15 +1479,7 @@ void TextureCache::DownloadDepth(Image& image, Buffer& destination, uint64_t des EXIT_NOT_IMPLEMENTED(transfer_slice > UINT64_MAX / layers); const uint64_t transfer_size = transfer_slice * layers; EXIT_NOT_IMPLEMENTED(guest_slice > full_slice_size); - std::vector copies(layers); - for (uint32_t layer = 0; layer < layers; layer++) { - auto& copy = copies[layer]; - copy.bufferOffset = full_slice_size * layer; - copy.bufferRowLength = info.pitch; - copy.bufferImageHeight = info.extent.height; - copy.imageSubresource = {vk::ImageAspectFlagBits::eDepth, 0, layer, 1}; - copy.imageExtent = {info.extent.width, info.extent.height, 1}; - } + auto copies = BuildDepthCopies(info, full_slice_size); if (transfer_bytes == info.bytes_per_block) { if (!info.IsTiled()) { for (auto& copy: copies) { @@ -1487,18 +1488,7 @@ void TextureCache::DownloadDepth(Image& image, Buffer& destination, uint64_t des image.Download(copies, destination.Handle(), destination_offset, info.data.size); return; } - TileBlockLayout block {}; - EXIT_NOT_IMPLEMENTED( - !TileGetBlockLayout(TileBlockFamily::Depth64KB, info.bytes_per_block, block)); - std::vector tiles; - tiles.reserve(layers); - for (uint32_t layer = 0; layer < layers; layer++) { - const uint64_t offset = full_slice_size * layer; - tiles.push_back({block.family, block.bytes_per_element, offset, full_slice_size, offset, - full_slice_size, 0, info.extent.width, info.extent.height, 1, - info.pitch}); - tiles.back().surface_z = layer; - } + const auto tiles = BuildDepthTiles(info); m_tiler.TileImage(image, copies, destination.Handle(), destination_offset, info.data.size, info.data.size, tiles); return; @@ -1526,17 +1516,7 @@ void TextureCache::DownloadDepth(Image& image, Buffer& destination, uint64_t des if (!tiled) { return; } - TileBlockLayout block {}; - EXIT_NOT_IMPLEMENTED( - !TileGetBlockLayout(TileBlockFamily::Depth64KB, info.bytes_per_block, block)); - std::vector tiles; - tiles.reserve(layers); - for (uint32_t layer = 0; layer < layers; layer++) { - const uint64_t offset = full_slice_size * layer; - tiles.push_back({block.family, block.bytes_per_element, offset, full_slice_size, offset, - full_slice_size, 0, info.extent.width, info.extent.height, 1, info.pitch}); - tiles.back().surface_z = layer; - } + const auto tiles = BuildDepthTiles(info); m_tiler.Tile(guest_linear.buffer, guest_linear.offset, info.data.size, destination.Handle(), destination_offset, info.data.size, tiles); } @@ -1573,7 +1553,7 @@ void TextureCache::DownloadImageData(Image& image, Buffer& destination, uint64_t } m_tiler.TileImage(image, texture.regions, destination.Handle(), destination_offset, - destination_size, texture.linear_size, texture.tiles, transform); + destination_size, texture.LinearSize(), texture.tiles, transform); } bool BufferCache::SynchronizeBufferFromImage(Buffer& buffer, uint64_t vaddr, uint64_t size) { @@ -1607,8 +1587,7 @@ bool BufferCache::SynchronizeBufferFromImage(Buffer& buffer, uint64_t vaddr, uin if (!selected) { return false; } - if (const auto owner = m_texture_cache.m_slot_images.try_get(selected); - owner != nullptr && owner->depth_id) { + if (const auto owner = m_texture_cache.m_slot_images.try_get(selected); owner != nullptr && owner->depth_id) { selected = owner->depth_id; } @@ -1661,7 +1640,6 @@ bool BufferCache::SynchronizeBufferFromImage(Buffer& buffer, uint64_t vaddr, uin texture.tiles)) { return false; } - texture.linear_size = GetLinearSize(texture.tiles); } } m_texture_cache.DownloadImageData(image, buffer, buf_offset, copy_size, std::move(plan)); diff --git a/src/graphics/host_gpu/renderer/image/image.cpp b/src/graphics/host_gpu/renderer/image/image.cpp index a28a74f9..7485e2ec 100644 --- a/src/graphics/host_gpu/renderer/image/image.cpp +++ b/src/graphics/host_gpu/renderer/image/image.cpp @@ -202,9 +202,7 @@ void Image::Transit(vk::ImageLayout destination_layout, vk::AccessFlags2 destina if (barriers.empty()) { return; } - if (m_scheduler != nullptr) { - m_scheduler->EndRendering(); - } + m_scheduler.EndRendering(); vk::DependencyInfo dependency {}; dependency.imageMemoryBarrierCount = static_cast(barriers.size()); dependency.pImageMemoryBarriers = barriers.data(); @@ -213,8 +211,8 @@ void Image::Transit(vk::ImageLayout destination_layout, vk::AccessFlags2 destina void Image::Upload(std::span copies, vk::Buffer buffer, uint64_t offset, uint64_t size) { - EXIT_IF(m_scheduler == nullptr || copies.empty() || buffer == nullptr || size == 0); - m_scheduler->EndRendering(); + EXIT_IF(copies.empty() || buffer == nullptr || size == 0); + m_scheduler.EndRendering(); vk::BufferMemoryBarrier2 buffer_barrier {}; buffer_barrier.srcStageMask = vk::PipelineStageFlagBits2::eAllCommands; buffer_barrier.srcAccessMask = vk::AccessFlagBits2::eMemoryWrite; @@ -234,7 +232,7 @@ void Image::Upload(std::span copies, vk::Buffer buffe dependency.pBufferMemoryBarriers = &buffer_barrier; dependency.imageMemoryBarrierCount = static_cast(image_barriers.size()); dependency.pImageMemoryBarriers = image_barriers.data(); - auto command = m_scheduler->Current().Handle(); + auto command = m_scheduler.Current().Handle(); command.pipelineBarrier2(dependency); command.copyBufferToImage(buffer, backing.image, vk::ImageLayout::eTransferDstOptimal, static_cast(copies.size()), copies.data()); @@ -252,8 +250,8 @@ void Image::Upload(std::span copies, vk::Buffer buffe void Image::Download(std::span copies, vk::Buffer buffer, uint64_t offset, uint64_t size) { - EXIT_IF(m_scheduler == nullptr || copies.empty() || buffer == nullptr || size == 0); - m_scheduler->EndRendering(); + EXIT_IF(copies.empty() || buffer == nullptr || size == 0); + m_scheduler.EndRendering(); vk::BufferMemoryBarrier2 buffer_barrier {}; buffer_barrier.srcStageMask = vk::PipelineStageFlagBits2::eAllCommands; buffer_barrier.srcAccessMask = @@ -274,7 +272,7 @@ void Image::Download(std::span copies, vk::Buffer buf dependency.pBufferMemoryBarriers = &buffer_barrier; dependency.imageMemoryBarrierCount = static_cast(image_barriers.size()); dependency.pImageMemoryBarriers = image_barriers.data(); - auto command = m_scheduler->Current().Handle(); + auto command = m_scheduler.Current().Handle(); command.pipelineBarrier2(dependency); command.copyImageToBuffer(backing.image, vk::ImageLayout::eTransferSrcOptimal, buffer, static_cast(copies.size()), copies.data()); @@ -311,8 +309,8 @@ std::pair Image::SanitizeCopyLayers(const Image& source, } void Image::CopyImage(Image& source) { - EXIT_IF(m_scheduler == nullptr || source.backing.samples != backing.samples); - m_scheduler->EndRendering(); + EXIT_IF(source.backing.samples != backing.samples); + m_scheduler.EndRendering(); const uint32_t levels = std::min(source.backing.mip_levels, backing.mip_levels); const uint32_t base_depth = backing.image_type == vk::ImageType::e3D ? backing.extent.depth @@ -351,7 +349,7 @@ void Image::CopyImage(Image& source) { if (copies.empty()) { return; } - auto command = m_scheduler->Current().Handle(); + auto command = m_scheduler.Current().Handle(); source.Transit(vk::ImageLayout::eTransferSrcOptimal, vk::AccessFlagBits2::eTransferRead, {}, command); Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits2::eTransferWrite, {}, command); @@ -364,8 +362,7 @@ void Image::CopyImage(Image& source) { void Image::Resolve(Image& source, const ImageSubresourceRange& source_range, const ImageSubresourceRange& destination_range) { - EXIT_IF(m_scheduler == nullptr || backing.samples != 1 || - source.backing.image_type != vk::ImageType::e2D || + EXIT_IF(backing.samples != 1 || source.backing.image_type != vk::ImageType::e2D || backing.image_type != vk::ImageType::e2D || source_range.level_count != 1 || destination_range.level_count != 1 || source_range.base_level >= source.backing.mip_levels || @@ -393,8 +390,8 @@ void Image::Resolve(Image& source, const ImageSubresourceRange& source_range, resolved_destination_range.layer_count = layers; const vk::Extent3D resolve_extent {info.extent.width, info.extent.height, 1}; - m_scheduler->EndRendering(); - auto command = m_scheduler->Current().Handle(); + m_scheduler.EndRendering(); + auto command = m_scheduler.Current().Handle(); source.Transit(vk::ImageLayout::eTransferSrcOptimal, vk::AccessFlagBits2::eTransferRead, resolved_source_range, command); Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits2::eTransferWrite, @@ -430,9 +427,8 @@ uint32_t Image::CopyRows(uint64_t row_size, uint32_t rows, uint64_t capacity) no } void Image::CopyImageWithBuffer(Image& source, Buffer& buffer) { - EXIT_IF(m_scheduler == nullptr || buffer.Handle() == nullptr || source.backing.samples != 1 || - backing.samples != 1); - m_scheduler->EndRendering(); + EXIT_IF(buffer.Handle() == nullptr || source.backing.samples != 1 || backing.samples != 1); + m_scheduler.EndRendering(); const uint32_t levels = std::min(source.backing.mip_levels, backing.mip_levels); const auto source_aspect = FullAspectMask(source.backing.format) & ~vk::ImageAspectFlagBits::eStencil; @@ -462,7 +458,7 @@ void Image::CopyImageWithBuffer(Image& source, Buffer& buffer) { dependency.dependencyFlags = vk::DependencyFlagBits::eByRegion; dependency.bufferMemoryBarrierCount = 1; dependency.pBufferMemoryBarriers = &barrier; - auto command = m_scheduler->Current().Handle(); + auto command = m_scheduler.Current().Handle(); source.Transit(vk::ImageLayout::eTransferSrcOptimal, vk::AccessFlagBits2::eTransferRead, {}, command); Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits2::eTransferWrite, {}, command); @@ -522,9 +518,9 @@ void Image::CopyImageWithBuffer(Image& source, Buffer& buffer) { } void Image::CopyMip(Image& source, uint32_t mip, uint32_t layer) { - EXIT_IF(m_scheduler == nullptr || source.backing.samples != backing.samples || - mip >= backing.mip_levels || layer >= backing.layers); - m_scheduler->EndRendering(); + EXIT_IF(source.backing.samples != backing.samples || mip >= backing.mip_levels || + layer >= backing.layers); + m_scheduler.EndRendering(); const auto width = std::max(backing.extent.width >> mip, 1u); const auto height = std::max(backing.extent.height >> mip, 1u); const auto depth = std::max(backing.extent.depth >> mip, 1u); @@ -544,7 +540,7 @@ void Image::CopyMip(Image& source, uint32_t mip, uint32_t layer) { copy.dstSubresource = {aspect, mip, layer, destination_layers}; copy.extent = {width, height, depth}; } - auto command = m_scheduler->Current().Handle(); + auto command = m_scheduler.Current().Handle(); Transit(vk::ImageLayout::eTransferDstOptimal, vk::AccessFlagBits2::eTransferWrite, {}, command); source.Transit(vk::ImageLayout::eTransferSrcOptimal, vk::AccessFlagBits2::eTransferRead, {}, command); @@ -648,7 +644,7 @@ Prospero::BufferFormat RenderTargetTransferFormat(uint32_t bytes_per_element) { } // namespace ImageOps Image::Image(GraphicContext& graphics, CommandScheduler& scheduler, const ImageInfo& image_info) - : info(image_info), m_graphics(&graphics), m_scheduler(&scheduler) { + : info(image_info), m_graphics(graphics), m_scheduler(scheduler) { KYTY_PROFILER_FUNCTION(); ImageOps::Validate(info); m_cpu_dirty = @@ -719,16 +715,13 @@ uint64_t Image::HashGuestEdges() const { Image::~Image() { KYTY_PROFILER_FUNCTION(); - if (m_graphics == nullptr) { - return; - } for (const auto& cached: views) { if (cached.view != nullptr) { - m_graphics->device.destroyImageView(cached.view, nullptr); + m_graphics.device.destroyImageView(cached.view, nullptr); } } if (backing.image != nullptr) { - m_graphics->DeleteImage(backing); + m_graphics.DeleteImage(backing); } } diff --git a/src/graphics/host_gpu/renderer/image/image.h b/src/graphics/host_gpu/renderer/image/image.h index 5b62f3b5..d94842ec 100644 --- a/src/graphics/host_gpu/renderer/image/image.h +++ b/src/graphics/host_gpu/renderer/image/image.h @@ -51,7 +51,6 @@ public: KYTY_CLASS_NO_COPY(Image); [[nodiscard]] vk::ImageView FindView(const ImageViewInfo& view_info); - void AssociateDepth(ImageId image_id) { depth_id = image_id; } using Barriers = std::vector; [[nodiscard]] Barriers GetBarriers(vk::ImageLayout destination_layout, vk::AccessFlags2 destination_access, @@ -163,8 +162,8 @@ private: [[nodiscard]] static std::pair SanitizeCopyLayers(const Image& source, const Image& destination, uint32_t depth); - GraphicContext* m_graphics = nullptr; - CommandScheduler* m_scheduler = nullptr; + GraphicContext& m_graphics; + CommandScheduler& m_scheduler; uint64_t m_maybe_cpu_hash = 0; bool m_cpu_dirty = false; bool m_maybe_cpu_dirty = false; diff --git a/src/graphics/host_gpu/renderer/image/imageView.cpp b/src/graphics/host_gpu/renderer/image/imageView.cpp index e0f946ca..be455f08 100644 --- a/src/graphics/host_gpu/renderer/image/imageView.cpp +++ b/src/graphics/host_gpu/renderer/image/imageView.cpp @@ -375,7 +375,7 @@ vk::ImageView Image::FindView(const ImageViewInfo& view_info) { create.subresourceRange.layerCount = normalized.layer_count; vk::ImageView view = nullptr; - const auto result = m_graphics->device.createImageView(&create, nullptr, &view); + const auto result = m_graphics.device.createImageView(&create, nullptr, &view); if (result != vk::Result::eSuccess || view == nullptr) { EXIT("failed to create image view: result=%d image_format=%d view_format=%d type=%d " "aspect=0x%x mip=%u+%u layer=%u+%u usage=0x%x\n", diff --git a/tests/ImagePageTableTests.cpp b/tests/ImagePageTableTests.cpp index d399c164..940310bb 100644 --- a/tests/ImagePageTableTests.cpp +++ b/tests/ImagePageTableTests.cpp @@ -21,16 +21,16 @@ void Check(bool value, const char* text) { } void TestMultiOwnerAndExactErase() { - Table table; + OwnerTable table; auto& owners = table.GetOrCreate(17); owners.push_back(11); owners.push_back(22); Check(table.Find(17) != nullptr && table.Find(17)->size() == 2, "both page owners are retained"); - Check(Libs::Graphics::EraseExact(owners, 11U), "registered owner is erased"); + Check(owners.Erase(11U), "registered owner is erased"); Check(owners.size() == 1 && owners.front() == 22, "erasing one owner preserves its neighbor"); - Check(!Libs::Graphics::EraseExact(owners, 33U), "missing owner is reported without mutation"); + Check(!owners.Erase(33U), "missing owner is reported without mutation"); } void TestCrossBucketRange() {