Browse Source
fix storage buffer cache for jamboree etc.
pull/129/head
Maufeat
8 months ago
committed by
crueter
No known key found for this signature in database
GPG Key ID: 425ACD2D4830EBC6
4 changed files with
27 additions and
5 deletions
-
src/core/hle/service/am/applet.h
-
src/core/hle/service/am/service/application_functions.cpp
-
src/video_core/buffer_cache/buffer_cache.h
-
src/video_core/renderer_vulkan/vk_graphics_pipeline.cpp
|
|
|
@ -92,6 +92,7 @@ struct Applet { |
|
|
|
// Channels |
|
|
|
std::deque<std::vector<u8>> user_channel_launch_parameter{}; |
|
|
|
std::deque<std::vector<u8>> preselected_user_launch_parameter{}; |
|
|
|
std::deque<std::vector<u8>> friend_invitation_storage_channel{}; |
|
|
|
|
|
|
|
// Caller applet |
|
|
|
std::weak_ptr<Applet> caller_applet{}; |
|
|
|
|
|
|
|
@ -456,8 +456,21 @@ Result IApplicationFunctions::GetFriendInvitationStorageChannelEvent( |
|
|
|
|
|
|
|
Result IApplicationFunctions::TryPopFromFriendInvitationStorageChannel( |
|
|
|
Out<SharedPointer<IStorage>> out_storage) { |
|
|
|
LOG_INFO(Service_AM, "(STUBBED) called"); |
|
|
|
R_THROW(AM::ResultNoDataInChannel); |
|
|
|
LOG_DEBUG(Service_AM, "called"); |
|
|
|
|
|
|
|
std::scoped_lock lk{m_applet->lock}; |
|
|
|
|
|
|
|
auto& channel = m_applet->friend_invitation_storage_channel; |
|
|
|
|
|
|
|
if (channel.empty()) { |
|
|
|
return AM::ResultNoDataInChannel; |
|
|
|
} |
|
|
|
|
|
|
|
auto data = channel.back(); |
|
|
|
channel.pop_back(); |
|
|
|
|
|
|
|
*out_storage = std::make_shared<IStorage>(system, std::move(data)); |
|
|
|
R_SUCCEED(); |
|
|
|
} |
|
|
|
|
|
|
|
Result IApplicationFunctions::GetNotificationStorageChannelEvent( |
|
|
|
|
|
|
|
@ -467,6 +467,10 @@ void BufferCache<P>::BindComputeStorageBuffer(size_t ssbo_index, u32 cbuf_index, |
|
|
|
channel_state->written_compute_storage_buffers |= (is_written ? 1U : 0U) << ssbo_index; |
|
|
|
|
|
|
|
const auto& launch_desc = kepler_compute->launch_description; |
|
|
|
if (((launch_desc.const_buffer_enable_mask >> cbuf_index) & 1) == 0) { |
|
|
|
LOG_WARNING(HW_GPU, "Skipped binding SSBO: cbuf index {} is not enabled", cbuf_index); |
|
|
|
return; |
|
|
|
} |
|
|
|
ASSERT(((launch_desc.const_buffer_enable_mask >> cbuf_index) & 1) != 0); |
|
|
|
|
|
|
|
const auto& cbufs = launch_desc.const_buffer_config; |
|
|
|
@ -1701,6 +1705,11 @@ template <class P> |
|
|
|
Binding BufferCache<P>::StorageBufferBinding(GPUVAddr ssbo_addr, u32 cbuf_index, |
|
|
|
bool is_written) const { |
|
|
|
const GPUVAddr gpu_addr = gpu_memory->Read<u64>(ssbo_addr); |
|
|
|
|
|
|
|
if (gpu_addr == 0) { |
|
|
|
return NULL_BINDING; |
|
|
|
} |
|
|
|
|
|
|
|
const auto size = [&]() { |
|
|
|
const bool is_nvn_cbuf = cbuf_index == 0; |
|
|
|
// The NVN driver buffer (index 0) is known to pack the SSBO address followed by its size. |
|
|
|
|
|
|
|
@ -324,9 +324,8 @@ bool GraphicsPipeline::ConfigureImpl(bool is_indexed) { |
|
|
|
size_t ssbo_index{}; |
|
|
|
for (const auto& desc : info.storage_buffers_descriptors) { |
|
|
|
ASSERT(desc.count == 1); |
|
|
|
if (!buffer_cache.BindGraphicsStorageBuffer(stage, ssbo_index, desc.cbuf_index, |
|
|
|
desc.cbuf_offset, desc.is_written)) |
|
|
|
return false; |
|
|
|
buffer_cache.BindGraphicsStorageBuffer(stage, ssbo_index, desc.cbuf_index, |
|
|
|
desc.cbuf_offset, desc.is_written); |
|
|
|
++ssbo_index; |
|
|
|
} |
|
|
|
} |
|
|
|
|