Browse Source

Revert "[TEST] Some miscellaneous changes within buffers queue and RAII deallocations"

vk-experiments9
CamilleLaVey 6 days ago
parent
commit
6f3e1b4471
  1. 22
      src/core/hle/service/nvdrv/nvdrv_interface.cpp
  2. 36
      src/core/hle/service/nvnflinger/buffer_queue_producer.cpp
  3. 1
      src/core/hle/service/nvnflinger/buffer_queue_producer.h
  4. 4
      src/video_core/buffer_cache/buffer_cache.h
  5. 1
      src/video_core/renderer_vulkan/blit_image.cpp

22
src/core/hle/service/nvdrv/nvdrv_interface.cpp

@ -5,8 +5,6 @@
// SPDX-FileCopyrightText: 2021 Skyline Team and Contributors // SPDX-FileCopyrightText: 2021 Skyline Team and Contributors
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
#include <algorithm>
#include "common/logging.h" #include "common/logging.h"
#include "common/scope_exit.h" #include "common/scope_exit.h"
#include "common/string_util.h" #include "common/string_util.h"
@ -21,17 +19,6 @@
namespace Service::Nvidia { namespace Service::Nvidia {
namespace {
size_t ClampIoctlOutputSize(size_t descriptor_size, u32 ioctl_length) {
if (ioctl_length == 0) {
return descriptor_size;
}
return (std::min)(descriptor_size, static_cast<size_t>(ioctl_length));
}
}
void NVDRV::Open(HLERequestContext& ctx) { void NVDRV::Open(HLERequestContext& ctx) {
LOG_DEBUG(Service_NVDRV, "called"); LOG_DEBUG(Service_NVDRV, "called");
IPC::ResponseBuilder rb{ctx, 4}; IPC::ResponseBuilder rb{ctx, 4};
@ -81,8 +68,7 @@ void NVDRV::Ioctl1(HLERequestContext& ctx) {
} }
// Check device // Check device
output_buffer.resize_destructive(
ClampIoctlOutputSize(ctx.GetWriteBufferSize(0), command.length));
output_buffer.resize_destructive(ctx.GetWriteBufferSize(0));
const auto input_buffer = ctx.ReadBuffer(0); const auto input_buffer = ctx.ReadBuffer(0);
const auto nv_result = nvdrv->Ioctl1(fd, command, input_buffer, output_buffer); const auto nv_result = nvdrv->Ioctl1(fd, command, input_buffer, output_buffer);
@ -109,8 +95,7 @@ void NVDRV::Ioctl2(HLERequestContext& ctx) {
const auto input_buffer = ctx.ReadBuffer(0); const auto input_buffer = ctx.ReadBuffer(0);
const auto input_inlined_buffer = ctx.ReadBuffer(1); const auto input_inlined_buffer = ctx.ReadBuffer(1);
output_buffer.resize_destructive(
ClampIoctlOutputSize(ctx.GetWriteBufferSize(0), command.length));
output_buffer.resize_destructive(ctx.GetWriteBufferSize(0));
const auto nv_result = const auto nv_result =
nvdrv->Ioctl2(fd, command, input_buffer, input_inlined_buffer, output_buffer); nvdrv->Ioctl2(fd, command, input_buffer, input_inlined_buffer, output_buffer);
@ -136,8 +121,7 @@ void NVDRV::Ioctl3(HLERequestContext& ctx) {
} }
const auto input_buffer = ctx.ReadBuffer(0); const auto input_buffer = ctx.ReadBuffer(0);
output_buffer.resize_destructive(
ClampIoctlOutputSize(ctx.GetWriteBufferSize(0), command.length));
output_buffer.resize_destructive(ctx.GetWriteBufferSize(0));
inline_output_buffer.resize_destructive(ctx.GetWriteBufferSize(1)); inline_output_buffer.resize_destructive(ctx.GetWriteBufferSize(1));
const auto nv_result = const auto nv_result =

36
src/core/hle/service/nvnflinger/buffer_queue_producer.cpp

@ -19,30 +19,11 @@
#include "core/hle/service/nvnflinger/buffer_queue_producer.h" #include "core/hle/service/nvnflinger/buffer_queue_producer.h"
#include "core/hle/service/nvnflinger/consumer_listener.h" #include "core/hle/service/nvnflinger/consumer_listener.h"
#include "core/hle/service/nvnflinger/parcel.h" #include "core/hle/service/nvnflinger/parcel.h"
#include "core/hle/service/nvnflinger/producer_listener.h"
#include "core/hle/service/nvnflinger/ui/graphic_buffer.h" #include "core/hle/service/nvnflinger/ui/graphic_buffer.h"
#include "core/hle/service/nvnflinger/window.h" #include "core/hle/service/nvnflinger/window.h"
namespace Service::android { namespace Service::android {
namespace {
class BufferWaitEventListener final : public IProducerListener {
public:
explicit BufferWaitEventListener(Kernel::KEvent* event_, Kernel::KernelCore& kernel_)
: event{event_}, kernel{kernel_} {}
void OnBufferReleased() override {
event->Signal(kernel);
}
private:
Kernel::KEvent* event;
Kernel::KernelCore& kernel;
};
}
BufferQueueProducer::BufferQueueProducer(Service::KernelHelpers::ServiceContext& service_context_, BufferQueueProducer::BufferQueueProducer(Service::KernelHelpers::ServiceContext& service_context_,
std::shared_ptr<BufferQueueCore> buffer_queue_core_, std::shared_ptr<BufferQueueCore> buffer_queue_core_,
Service::Nvidia::NvCore::NvMap& nvmap_) Service::Nvidia::NvCore::NvMap& nvmap_)
@ -54,13 +35,6 @@ BufferQueueProducer::BufferQueueProducer(Service::KernelHelpers::ServiceContext&
} }
BufferQueueProducer::~BufferQueueProducer() { BufferQueueProducer::~BufferQueueProducer() {
{
std::scoped_lock lock{core->mutex};
if (core->connected_producer_listener == internal_listener) {
core->connected_producer_listener = nullptr;
}
internal_listener = nullptr;
}
service_context.CloseEvent(buffer_wait_event); service_context.CloseEvent(buffer_wait_event);
} }
@ -694,15 +668,7 @@ Status BufferQueueProducer::Connect(const std::shared_ptr<IProducerListener>& li
core->connected_api = api; core->connected_api = api;
output->Inflate(core->default_width, core->default_height, core->transform_hint, output->Inflate(core->default_width, core->default_height, core->transform_hint,
static_cast<u32>(core->queue.size())); static_cast<u32>(core->queue.size()));
if (listener != nullptr) {
core->connected_producer_listener = listener;
} else {
if (internal_listener == nullptr) {
internal_listener = std::make_shared<BufferWaitEventListener>(
buffer_wait_event, service_context.kernel);
}
core->connected_producer_listener = internal_listener;
}
core->connected_producer_listener = listener;
break; break;
default: default:
LOG_ERROR(Service_Nvnflinger, "unknown api = {}", api); LOG_ERROR(Service_Nvnflinger, "unknown api = {}", api);

1
src/core/hle/service/nvnflinger/buffer_queue_producer.h

@ -81,7 +81,6 @@ private:
Kernel::KEvent* buffer_wait_event{}; Kernel::KEvent* buffer_wait_event{};
Service::KernelHelpers::ServiceContext& service_context; Service::KernelHelpers::ServiceContext& service_context;
std::shared_ptr<IProducerListener> internal_listener;
std::shared_ptr<BufferQueueCore> core; std::shared_ptr<BufferQueueCore> core;
BufferQueueDefs::SlotsType& slots; BufferQueueDefs::SlotsType& slots;

4
src/video_core/buffer_cache/buffer_cache.h

@ -1565,10 +1565,10 @@ typename BufferCache<P>::OverlapResult BufferCache<P>::ResolveOverlaps(DAddr dev
// When this memory region has been joined a bunch of times, we assume it's being used // When this memory region has been joined a bunch of times, we assume it's being used
// as a stream buffer. Increase the size to skip constantly recreating buffers. // as a stream buffer. Increase the size to skip constantly recreating buffers.
has_stream_leap = true; has_stream_leap = true;
if (expands_left) {
if (expands_right) {
expand_begin(CACHING_PAGESIZE * 128); expand_begin(CACHING_PAGESIZE * 128);
} }
if (expands_right) {
if (expands_left) {
expand_end(CACHING_PAGESIZE * 128); expand_end(CACHING_PAGESIZE * 128);
} }
} }

1
src/video_core/renderer_vulkan/blit_image.cpp

@ -797,6 +797,7 @@ void BlitImageHelper::ConvertR16ToD16(const Framebuffer* dst_framebuffer,
void BlitImageHelper::ConvertABGR8ToD24S8(const Framebuffer* dst_framebuffer, void BlitImageHelper::ConvertABGR8ToD24S8(const Framebuffer* dst_framebuffer,
const ImageView& src_image_view) { const ImageView& src_image_view) {
if (!device.IsExtShaderStencilExportSupported()) { if (!device.IsExtShaderStencilExportSupported()) {
// Shader requires VK_EXT_shader_stencil_export which is not available
LOG_WARNING(Render_Vulkan, "ConvertABGR8ToD24S8 requires shader_stencil_export, skipping"); LOG_WARNING(Render_Vulkan, "ConvertABGR8ToD24S8 requires shader_stencil_export, skipping");
return; return;
} }

Loading…
Cancel
Save