summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGravatar Tony Wasserka2014-06-01 00:08:00 +0200
committerGravatar Tony Wasserka2014-07-23 00:33:08 +0200
commit16bbc4f81b89462ff1c9e9364e0ca7ee1289c3b3 (patch)
tree31b0a53d80f519d543b8ec47d8b937c70fea2cda /src/core
parentGSP: HLE GXCommandId::SET_DISPLAY_TRANSFER and GXCommandId::SET_TEXTURE_COPY. (diff)
downloadyuzu-16bbc4f81b89462ff1c9e9364e0ca7ee1289c3b3.tar.gz
yuzu-16bbc4f81b89462ff1c9e9364e0ca7ee1289c3b3.tar.xz
yuzu-16bbc4f81b89462ff1c9e9364e0ca7ee1289c3b3.zip
GPU: Add display transfer configuration.
Diffstat (limited to 'src/core')
-rw-r--r--src/core/hw/gpu.cpp52
-rw-r--r--src/core/hw/gpu.h40
2 files changed, 92 insertions, 0 deletions
diff --git a/src/core/hw/gpu.cpp b/src/core/hw/gpu.cpp
index f0ca4eada..a400338b5 100644
--- a/src/core/hw/gpu.cpp
+++ b/src/core/hw/gpu.cpp
@@ -108,6 +108,31 @@ inline void Read(T &var, const u32 addr) {
108 var = g_regs.framebuffer_sub_right_1; 108 var = g_regs.framebuffer_sub_right_1;
109 break; 109 break;
110 110
111 case Registers::DisplayInputBufferAddr:
112 var = g_regs.display_transfer.input_address;
113 break;
114
115 case Registers::DisplayOutputBufferAddr:
116 var = g_regs.display_transfer.output_address;
117 break;
118
119 case Registers::DisplayOutputBufferSize:
120 var = g_regs.display_transfer.output_size;
121 break;
122
123 case Registers::DisplayInputBufferSize:
124 var = g_regs.display_transfer.input_size;
125 break;
126
127 case Registers::DisplayTransferFlags:
128 var = g_regs.display_transfer.flags;
129 break;
130
131 // Not sure if this is supposed to be readable
132 case Registers::DisplayTriggerTransfer:
133 var = g_regs.display_transfer.trigger;
134 break;
135
111 case Registers::CommandListSize: 136 case Registers::CommandListSize:
112 var = g_regs.command_list_size; 137 var = g_regs.command_list_size;
113 break; 138 break;
@@ -129,6 +154,33 @@ inline void Read(T &var, const u32 addr) {
129template <typename T> 154template <typename T>
130inline void Write(u32 addr, const T data) { 155inline void Write(u32 addr, const T data) {
131 switch (static_cast<Registers::Id>(addr)) { 156 switch (static_cast<Registers::Id>(addr)) {
157 case Registers::DisplayInputBufferAddr:
158 g_regs.display_transfer.input_address = data;
159 break;
160
161 case Registers::DisplayOutputBufferAddr:
162 g_regs.display_transfer.output_address = data;
163 break;
164
165 case Registers::DisplayOutputBufferSize:
166 g_regs.display_transfer.output_size = data;
167 break;
168
169 case Registers::DisplayInputBufferSize:
170 g_regs.display_transfer.input_size = data;
171 break;
172
173 case Registers::DisplayTransferFlags:
174 g_regs.display_transfer.flags = data;
175 break;
176
177 case Registers::DisplayTriggerTransfer:
178 g_regs.display_transfer.trigger = data;
179 if (g_regs.display_transfer.trigger & 1) {
180 // TODO: Perform display transfer!
181 }
182 break;
183
132 case Registers::CommandListSize: 184 case Registers::CommandListSize:
133 g_regs.command_list_size = data; 185 g_regs.command_list_size = data;
134 break; 186 break;
diff --git a/src/core/hw/gpu.h b/src/core/hw/gpu.h
index 58058d732..29eb7ed81 100644
--- a/src/core/hw/gpu.h
+++ b/src/core/hw/gpu.h
@@ -5,6 +5,7 @@
5#pragma once 5#pragma once
6 6
7#include "common/common_types.h" 7#include "common/common_types.h"
8#include "common/bit_field.h"
8 9
9namespace GPU { 10namespace GPU {
10 11
@@ -44,6 +45,45 @@ struct Registers {
44 u32 framebuffer_sub_right_1; 45 u32 framebuffer_sub_right_1;
45 u32 framebuffer_sub_right_2; 46 u32 framebuffer_sub_right_2;
46 47
48 struct {
49 u32 input_address;
50 u32 output_address;
51
52 inline u32 GetPhysicalInputAddress() const {
53 return input_address * 8;
54 }
55
56 inline u32 GetPhysicalOutputAddress() const {
57 return output_address * 8;
58 }
59
60 union {
61 u32 output_size;
62
63 BitField< 0, 16, u32> output_width;
64 BitField<16, 16, u32> output_height;
65 };
66
67 union {
68 u32 input_size;
69
70 BitField< 0, 16, u32> input_width;
71 BitField<16, 16, u32> input_height;
72 };
73
74 union {
75 u32 flags;
76
77 BitField< 0, 1, u32> flip_data;
78 BitField< 8, 3, u32> input_format;
79 BitField<12, 3, u32> output_format;
80 BitField<16, 1, u32> output_tiled;
81 };
82
83 u32 unknown;
84 u32 trigger;
85 } display_transfer;
86
47 u32 command_list_size; 87 u32 command_list_size;
48 u32 command_list_address; 88 u32 command_list_address;
49 u32 command_processing_enabled; 89 u32 command_processing_enabled;