|
|
|
@ -278,12 +278,10 @@ void GraphicsPipeline::AddTransition(GraphicsPipeline* transition) { |
|
|
|
|
|
|
|
template <typename Spec> |
|
|
|
void GraphicsPipeline::ConfigureImpl(bool is_indexed) { |
|
|
|
std::array<ImageId, MAX_IMAGE_ELEMENTS> image_view_ids; |
|
|
|
std::array<u32, MAX_IMAGE_ELEMENTS> image_view_indices; |
|
|
|
std::array<bool, MAX_IMAGE_ELEMENTS> image_view_blacklist; |
|
|
|
std::array<VideoCommon::ImageViewInOut, MAX_IMAGE_ELEMENTS> views; |
|
|
|
std::array<VkSampler, MAX_IMAGE_ELEMENTS> samplers; |
|
|
|
size_t sampler_index{}; |
|
|
|
size_t image_index{}; |
|
|
|
size_t view_index{}; |
|
|
|
|
|
|
|
texture_cache.SynchronizeGraphicsDescriptors(); |
|
|
|
|
|
|
|
@ -291,8 +289,6 @@ void GraphicsPipeline::ConfigureImpl(bool is_indexed) { |
|
|
|
|
|
|
|
const auto& regs{maxwell3d.regs}; |
|
|
|
const bool via_header_index{regs.sampler_index == Maxwell::SamplerIndex::ViaHeaderIndex}; |
|
|
|
u32 start_black_list = std::numeric_limits<u32>::max(); |
|
|
|
u32 end_black_list = 0; |
|
|
|
const auto config_stage{[&](size_t stage) LAMBDA_FORCEINLINE { |
|
|
|
const Shader::Info& info{stage_infos[stage]}; |
|
|
|
buffer_cache.UnbindGraphicsStorageBuffers(stage); |
|
|
|
@ -329,7 +325,7 @@ void GraphicsPipeline::ConfigureImpl(bool is_indexed) { |
|
|
|
const auto add_image{[&](const auto& desc) { |
|
|
|
for (u32 index = 0; index < desc.count; ++index) { |
|
|
|
const auto handle{read_handle(desc, index)}; |
|
|
|
image_view_indices[image_index++] = handle.first; |
|
|
|
views[view_index++] = {handle.first}; |
|
|
|
} |
|
|
|
}}; |
|
|
|
if constexpr (Spec::has_texture_buffers) { |
|
|
|
@ -345,7 +341,7 @@ void GraphicsPipeline::ConfigureImpl(bool is_indexed) { |
|
|
|
for (const auto& desc : info.texture_descriptors) { |
|
|
|
for (u32 index = 0; index < desc.count; ++index) { |
|
|
|
const auto handle{read_handle(desc, index)}; |
|
|
|
image_view_indices[image_index++] = handle.first; |
|
|
|
views[view_index++] = {handle.first}; |
|
|
|
|
|
|
|
Sampler* const sampler{texture_cache.GetGraphicsSampler(handle.second)}; |
|
|
|
samplers[sampler_index++] = sampler->Handle(); |
|
|
|
@ -353,15 +349,6 @@ void GraphicsPipeline::ConfigureImpl(bool is_indexed) { |
|
|
|
} |
|
|
|
if constexpr (Spec::has_images) { |
|
|
|
for (const auto& desc : info.image_descriptors) { |
|
|
|
if (desc.is_written && (desc.type == Shader::TextureType::Color2D || |
|
|
|
desc.type == Shader::TextureType::ColorArray2D)) { |
|
|
|
auto index_copy = image_index; |
|
|
|
for (u32 index = 0; index < desc.count; ++index) { |
|
|
|
start_black_list = std::min<u32>(start_black_list, index_copy); |
|
|
|
image_view_blacklist[index_copy++] = true; |
|
|
|
end_black_list = std::max<u32>(end_black_list, index_copy); |
|
|
|
} |
|
|
|
} |
|
|
|
add_image(desc); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -381,24 +368,9 @@ void GraphicsPipeline::ConfigureImpl(bool is_indexed) { |
|
|
|
if constexpr (Spec::enabled_stages[4]) { |
|
|
|
config_stage(4); |
|
|
|
} |
|
|
|
const std::span indices_span(image_view_indices.data(), image_index); |
|
|
|
bool has_listed_stuffs; |
|
|
|
do { |
|
|
|
has_listed_stuffs = false; |
|
|
|
texture_cache.FillGraphicsImageViews(indices_span, image_view_ids); |
|
|
|
if constexpr (Spec::has_images) { |
|
|
|
if (start_black_list < end_black_list) { |
|
|
|
for (u32 index = start_black_list; index < end_black_list; index++) { |
|
|
|
if (image_view_blacklist[index]) { |
|
|
|
ImageView& image_view{texture_cache.GetImageView(image_view_ids[index])}; |
|
|
|
has_listed_stuffs |= texture_cache.BlackListImage(image_view.image_id); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} while (has_listed_stuffs); |
|
|
|
texture_cache.FillGraphicsImageViews<Spec::has_images>(std::span(views.data(), view_index)); |
|
|
|
|
|
|
|
ImageId* texture_buffer_index{image_view_ids.data()}; |
|
|
|
VideoCommon::ImageViewInOut* texture_buffer_it{views.data()}; |
|
|
|
const auto bind_stage_info{[&](size_t stage) LAMBDA_FORCEINLINE { |
|
|
|
size_t index{}; |
|
|
|
const auto add_buffer{[&](const auto& desc) { |
|
|
|
@ -408,12 +380,12 @@ void GraphicsPipeline::ConfigureImpl(bool is_indexed) { |
|
|
|
if constexpr (is_image) { |
|
|
|
is_written = desc.is_written; |
|
|
|
} |
|
|
|
ImageView& image_view{texture_cache.GetImageView(*texture_buffer_index)}; |
|
|
|
ImageView& image_view{texture_cache.GetImageView(texture_buffer_it->id)}; |
|
|
|
buffer_cache.BindGraphicsTextureBuffer(stage, index, image_view.GpuAddr(), |
|
|
|
image_view.BufferSize(), image_view.format, |
|
|
|
is_written, is_image); |
|
|
|
++index; |
|
|
|
++texture_buffer_index; |
|
|
|
++texture_buffer_it; |
|
|
|
} |
|
|
|
}}; |
|
|
|
buffer_cache.UnbindGraphicsTextureBuffers(stage); |
|
|
|
@ -429,9 +401,9 @@ void GraphicsPipeline::ConfigureImpl(bool is_indexed) { |
|
|
|
add_buffer(desc); |
|
|
|
} |
|
|
|
} |
|
|
|
texture_buffer_index += Shader::NumDescriptors(info.texture_descriptors); |
|
|
|
texture_buffer_it += Shader::NumDescriptors(info.texture_descriptors); |
|
|
|
if constexpr (Spec::has_images) { |
|
|
|
texture_buffer_index += Shader::NumDescriptors(info.image_descriptors); |
|
|
|
texture_buffer_it += Shader::NumDescriptors(info.image_descriptors); |
|
|
|
} |
|
|
|
}}; |
|
|
|
if constexpr (Spec::enabled_stages[0]) { |
|
|
|
@ -457,11 +429,11 @@ void GraphicsPipeline::ConfigureImpl(bool is_indexed) { |
|
|
|
|
|
|
|
RescalingPushConstant rescaling(num_textures); |
|
|
|
const VkSampler* samplers_it{samplers.data()}; |
|
|
|
const ImageId* views_it{image_view_ids.data()}; |
|
|
|
const VideoCommon::ImageViewInOut* views_it{views.data()}; |
|
|
|
const auto prepare_stage{[&](size_t stage) LAMBDA_FORCEINLINE { |
|
|
|
buffer_cache.BindHostStageBuffers(stage); |
|
|
|
PushImageDescriptors(stage_infos[stage], samplers_it, views_it, texture_cache, |
|
|
|
update_descriptor_queue, rescaling); |
|
|
|
PushImageDescriptors(texture_cache, update_descriptor_queue, stage_infos[stage], rescaling, |
|
|
|
samplers_it, views_it); |
|
|
|
}}; |
|
|
|
if constexpr (Spec::enabled_stages[0]) { |
|
|
|
prepare_stage(0); |
|
|
|
|