summaryrefslogtreecommitdiffstats
path: root/src/core
diff options
context:
space:
mode:
authorbunnei <bunneidev@gmail.com>2015-05-23 01:40:57 +0200
committerbunnei <bunneidev@gmail.com>2015-05-23 01:40:57 +0200
commit7b94b312d39037e9a90c981b49743965c0d1a743 (patch)
treef922946de22f54bf0c0aaaff01371f5ca7a2fc57 /src/core
parentMerge pull request #798 from yuriks/y2r-bw (diff)
parentFlush for y2r (moflex) (diff)
downloadyuzu-7b94b312d39037e9a90c981b49743965c0d1a743.tar
yuzu-7b94b312d39037e9a90c981b49743965c0d1a743.tar.gz
yuzu-7b94b312d39037e9a90c981b49743965c0d1a743.tar.bz2
yuzu-7b94b312d39037e9a90c981b49743965c0d1a743.tar.lz
yuzu-7b94b312d39037e9a90c981b49743965c0d1a743.tar.xz
yuzu-7b94b312d39037e9a90c981b49743965c0d1a743.tar.zst
yuzu-7b94b312d39037e9a90c981b49743965c0d1a743.zip
Diffstat (limited to 'src/core')
-rw-r--r--src/core/hle/service/gsp_gpu.cpp9
-rw-r--r--src/core/hle/service/y2r_u.cpp11
-rw-r--r--src/core/hw/gpu.cpp16
-rw-r--r--src/core/settings.h2
4 files changed, 35 insertions, 3 deletions
diff --git a/src/core/hle/service/gsp_gpu.cpp b/src/core/hle/service/gsp_gpu.cpp
index c11c5faba..c56475ae4 100644
--- a/src/core/hle/service/gsp_gpu.cpp
+++ b/src/core/hle/service/gsp_gpu.cpp
@@ -15,6 +15,7 @@
#include "core/hw/lcd.h"
#include "video_core/gpu_debugger.h"
+#include "video_core/video_core.h"
// Main graphics debugger object - TODO: Here is probably not the best place for this
GraphicsDebugger g_debugger;
@@ -264,6 +265,8 @@ static void FlushDataCache(Service::Interface* self) {
u32 size = cmd_buff[2];
u32 process = cmd_buff[4];
+ VideoCore::g_renderer->hw_rasterizer->NotifyFlush(Memory::VirtualToPhysicalAddress(address), size);
+
// TODO(purpasmart96): Verify return header on HW
cmd_buff[1] = RESULT_SUCCESS.raw; // No error
@@ -352,10 +355,16 @@ static void ExecuteCommand(const Command& command, u32 thread_id) {
// GX request DMA - typically used for copying memory from GSP heap to VRAM
case CommandId::REQUEST_DMA:
+ VideoCore::g_renderer->hw_rasterizer->NotifyPreRead(Memory::VirtualToPhysicalAddress(command.dma_request.source_address),
+ command.dma_request.size);
+
memcpy(Memory::GetPointer(command.dma_request.dest_address),
Memory::GetPointer(command.dma_request.source_address),
command.dma_request.size);
SignalInterrupt(InterruptId::DMA);
+
+ VideoCore::g_renderer->hw_rasterizer->NotifyFlush(Memory::VirtualToPhysicalAddress(command.dma_request.dest_address),
+ command.dma_request.size);
break;
// ctrulib homebrew sends all relevant command list data with this command,
diff --git a/src/core/hle/service/y2r_u.cpp b/src/core/hle/service/y2r_u.cpp
index ce822e990..15987e028 100644
--- a/src/core/hle/service/y2r_u.cpp
+++ b/src/core/hle/service/y2r_u.cpp
@@ -9,7 +9,11 @@
#include "core/hle/hle.h"
#include "core/hle/kernel/event.h"
#include "core/hle/service/y2r_u.h"
+#include "core/mem_map.h"
+#include "core/memory.h"
+
#include "video_core/utils.h"
+#include "video_core/video_core.h"
////////////////////////////////////////////////////////////////////////////////////////////////////
// Namespace Y2R_U
@@ -260,6 +264,13 @@ static void StartConversion(Service::Interface* self) {
break;
}
}
+
+ // dst_image_size would seem to be perfect for this, but it doesn't include the stride :(
+ u32 total_output_size = conversion_params.input_lines *
+ (conversion_params.dst_transfer_unit + conversion_params.dst_stride);
+ VideoCore::g_renderer->hw_rasterizer->NotifyFlush(
+ Memory::VirtualToPhysicalAddress(conversion_params.dst_address), total_output_size);
+
LOG_DEBUG(Service_Y2R, "called");
completion_event->Signal();
diff --git a/src/core/hw/gpu.cpp b/src/core/hw/gpu.cpp
index 8ef1f70df..ddc5d647e 100644
--- a/src/core/hw/gpu.cpp
+++ b/src/core/hw/gpu.cpp
@@ -106,6 +106,8 @@ inline void Write(u32 addr, const T data) {
} else {
GSP_GPU::SignalInterrupt(GSP_GPU::InterruptId::PSC1);
}
+
+ VideoCore::g_renderer->hw_rasterizer->NotifyFlush(config.GetStartAddress(), config.GetEndAddress() - config.GetStartAddress());
}
break;
}
@@ -129,19 +131,25 @@ inline void Write(u32 addr, const T data) {
u32 output_width = config.output_width / horizontal_scale;
u32 output_height = config.output_height / vertical_scale;
+ u32 input_size = config.input_width * config.input_height * GPU::Regs::BytesPerPixel(config.input_format);
+ u32 output_size = output_width * output_height * GPU::Regs::BytesPerPixel(config.output_format);
+
+ VideoCore::g_renderer->hw_rasterizer->NotifyPreRead(config.GetPhysicalInputAddress(), input_size);
+
if (config.raw_copy) {
// Raw copies do not perform color conversion nor tiled->linear / linear->tiled conversions
// TODO(Subv): Verify if raw copies perform scaling
- memcpy(dst_pointer, src_pointer, config.output_width * config.output_height *
- GPU::Regs::BytesPerPixel(config.output_format));
+ memcpy(dst_pointer, src_pointer, output_size);
LOG_TRACE(HW_GPU, "DisplayTriggerTransfer: 0x%08x bytes from 0x%08x(%ux%u)-> 0x%08x(%ux%u), output format: %x, flags 0x%08X, Raw copy",
- config.output_height * output_width * GPU::Regs::BytesPerPixel(config.output_format),
+ output_size,
config.GetPhysicalInputAddress(), config.input_width.Value(), config.input_height.Value(),
config.GetPhysicalOutputAddress(), config.output_width.Value(), config.output_height.Value(),
config.output_format.Value(), config.flags);
GSP_GPU::SignalInterrupt(GSP_GPU::InterruptId::PPF);
+
+ VideoCore::g_renderer->hw_rasterizer->NotifyFlush(config.GetPhysicalOutputAddress(), output_size);
break;
}
@@ -247,6 +255,8 @@ inline void Write(u32 addr, const T data) {
config.output_format.Value(), config.flags);
GSP_GPU::SignalInterrupt(GSP_GPU::InterruptId::PPF);
+
+ VideoCore::g_renderer->hw_rasterizer->NotifyFlush(config.GetPhysicalOutputAddress(), output_size);
}
break;
}
diff --git a/src/core/settings.h b/src/core/settings.h
index 0f4700241..54c1023b8 100644
--- a/src/core/settings.h
+++ b/src/core/settings.h
@@ -45,6 +45,8 @@ struct Values {
int region_value;
// Renderer
+ bool use_hw_renderer;
+
float bg_red;
float bg_green;
float bg_blue;