summaryrefslogtreecommitdiff
path: root/src/core/hw/gpu.cpp
diff options
context:
space:
mode:
authorGravatar Tony Wasserka2014-05-17 22:50:33 +0200
committerGravatar bunnei2014-06-12 06:10:49 -0400
commit1dfa3928242ad486040b1c65768faa2c7fce4654 (patch)
tree50efedc7e5090c36df63043bd542e7e8508fa1c0 /src/core/hw/gpu.cpp
parentcitra-qt: Add GX command history viewer. (diff)
downloadyuzu-1dfa3928242ad486040b1c65768faa2c7fce4654.tar.gz
yuzu-1dfa3928242ad486040b1c65768faa2c7fce4654.tar.xz
yuzu-1dfa3928242ad486040b1c65768faa2c7fce4654.zip
Rename LCD to GPU.
Diffstat (limited to 'src/core/hw/gpu.cpp')
-rw-r--r--src/core/hw/gpu.cpp194
1 files changed, 194 insertions, 0 deletions
diff --git a/src/core/hw/gpu.cpp b/src/core/hw/gpu.cpp
new file mode 100644
index 000000000..632e1aaac
--- /dev/null
+++ b/src/core/hw/gpu.cpp
@@ -0,0 +1,194 @@
1// Copyright 2014 Citra Emulator Project
2// Licensed under GPLv2
3// Refer to the license.txt file included.
4
5#include "common/common_types.h"
6#include "common/log.h"
7
8#include "core/core.h"
9#include "core/mem_map.h"
10#include "core/hle/kernel/thread.h"
11#include "core/hw/gpu.h"
12
13#include "video_core/video_core.h"
14
15
16namespace GPU {
17
18Registers g_regs;
19
20static const u32 kFrameTicks = 268123480 / 60; ///< 268MHz / 60 frames per second
21
22u64 g_last_ticks = 0; ///< Last CPU ticks
23
24/**
25 * Sets whether the framebuffers are in the GSP heap (FCRAM) or VRAM
26 * @param
27 */
28void SetFramebufferLocation(const FramebufferLocation mode) {
29 switch (mode) {
30 case FRAMEBUFFER_LOCATION_FCRAM:
31 g_regs.framebuffer_top_left_1 = PADDR_TOP_LEFT_FRAME1;
32 g_regs.framebuffer_top_left_2 = PADDR_TOP_LEFT_FRAME2;
33 g_regs.framebuffer_top_right_1 = PADDR_TOP_RIGHT_FRAME1;
34 g_regs.framebuffer_top_right_2 = PADDR_TOP_RIGHT_FRAME2;
35 g_regs.framebuffer_sub_left_1 = PADDR_SUB_FRAME1;
36 //g_regs.framebuffer_sub_left_2 = unknown;
37 g_regs.framebuffer_sub_right_1 = PADDR_SUB_FRAME2;
38 //g_regs.framebufferr_sub_right_2 = unknown;
39 break;
40
41 case FRAMEBUFFER_LOCATION_VRAM:
42 g_regs.framebuffer_top_left_1 = PADDR_VRAM_TOP_LEFT_FRAME1;
43 g_regs.framebuffer_top_left_2 = PADDR_VRAM_TOP_LEFT_FRAME2;
44 g_regs.framebuffer_top_right_1 = PADDR_VRAM_TOP_RIGHT_FRAME1;
45 g_regs.framebuffer_top_right_2 = PADDR_VRAM_TOP_RIGHT_FRAME2;
46 g_regs.framebuffer_sub_left_1 = PADDR_VRAM_SUB_FRAME1;
47 //g_regs.framebuffer_sub_left_2 = unknown;
48 g_regs.framebuffer_sub_right_1 = PADDR_VRAM_SUB_FRAME2;
49 //g_regs.framebufferr_sub_right_2 = unknown;
50 break;
51 }
52}
53
54/**
55 * Gets the location of the framebuffers
56 * @return Location of framebuffers as FramebufferLocation enum
57 */
58const FramebufferLocation GetFramebufferLocation() {
59 if ((g_regs.framebuffer_top_right_1 & ~Memory::VRAM_MASK) == Memory::VRAM_PADDR) {
60 return FRAMEBUFFER_LOCATION_VRAM;
61 } else if ((g_regs.framebuffer_top_right_1 & ~Memory::FCRAM_MASK) == Memory::FCRAM_PADDR) {
62 return FRAMEBUFFER_LOCATION_FCRAM;
63 } else {
64 ERROR_LOG(GPU, "unknown framebuffer location!");
65 }
66 return FRAMEBUFFER_LOCATION_UNKNOWN;
67}
68
69/**
70 * Gets a read-only pointer to a framebuffer in memory
71 * @param address Physical address of framebuffer
72 * @return Returns const pointer to raw framebuffer
73 */
74const u8* GetFramebufferPointer(const u32 address) {
75 switch (GetFramebufferLocation()) {
76 case FRAMEBUFFER_LOCATION_FCRAM:
77 return (const u8*)Memory::GetPointer(Memory::VirtualAddressFromPhysical_FCRAM(address));
78 case FRAMEBUFFER_LOCATION_VRAM:
79 return (const u8*)Memory::GetPointer(Memory::VirtualAddressFromPhysical_VRAM(address));
80 default:
81 ERROR_LOG(GPU, "unknown framebuffer location");
82 }
83 return NULL;
84}
85
86template <typename T>
87inline void Read(T &var, const u32 addr) {
88 switch (addr) {
89 case REG_FRAMEBUFFER_TOP_LEFT_1:
90 var = g_regs.framebuffer_top_left_1;
91 break;
92
93 case REG_FRAMEBUFFER_TOP_LEFT_2:
94 var = g_regs.framebuffer_top_left_2;
95 break;
96
97 case REG_FRAMEBUFFER_TOP_RIGHT_1:
98 var = g_regs.framebuffer_top_right_1;
99 break;
100
101 case REG_FRAMEBUFFER_TOP_RIGHT_2:
102 var = g_regs.framebuffer_top_right_2;
103 break;
104
105 case REG_FRAMEBUFFER_SUB_LEFT_1:
106 var = g_regs.framebuffer_sub_left_1;
107 break;
108
109 case REG_FRAMEBUFFER_SUB_RIGHT_1:
110 var = g_regs.framebuffer_sub_right_1;
111 break;
112
113 case CommandListSize:
114 var = g_regs.command_list_size;
115 break;
116
117 case CommandListAddress:
118 var = g_regs.command_list_address;
119 break;
120
121 case ProcessCommandList:
122 var = g_regs.command_processing_enabled;
123 break;
124
125 default:
126 ERROR_LOG(GPU, "unknown Read%d @ 0x%08X", sizeof(var) * 8, addr);
127 break;
128 }
129}
130
131template <typename T>
132inline void Write(u32 addr, const T data) {
133 switch (addr) {
134 case CommandListSize:
135 g_regs.command_list_size = data;
136 break;
137
138 case CommandListAddress:
139 g_regs.command_list_address = data;
140 break;
141
142 case ProcessCommandList:
143 g_regs.command_processing_enabled = data;
144 if (g_regs.command_processing_enabled & 1)
145 {
146 // u32* buffer = (u32*)Memory::GetPointer(g_regs.command_list_address << 3);
147 ERROR_LOG(GPU, "Beginning %x bytes of commands from address %x", g_regs.command_list_size, g_regs.command_list_address << 3);
148 // TODO: Process command list!
149 }
150 break;
151
152 default:
153 ERROR_LOG(GPU, "unknown Write%d 0x%08X @ 0x%08X", sizeof(data) * 8, data, addr);
154 break;
155 }
156}
157
158// Explicitly instantiate template functions because we aren't defining this in the header:
159
160template void Read<u64>(u64 &var, const u32 addr);
161template void Read<u32>(u32 &var, const u32 addr);
162template void Read<u16>(u16 &var, const u32 addr);
163template void Read<u8>(u8 &var, const u32 addr);
164
165template void Write<u64>(u32 addr, const u64 data);
166template void Write<u32>(u32 addr, const u32 data);
167template void Write<u16>(u32 addr, const u16 data);
168template void Write<u8>(u32 addr, const u8 data);
169
170/// Update hardware
171void Update() {
172 u64 current_ticks = Core::g_app_core->GetTicks();
173
174 // Fake a vertical blank
175 if ((current_ticks - g_last_ticks) >= kFrameTicks) {
176 g_last_ticks = current_ticks;
177 VideoCore::g_renderer->SwapBuffers();
178 Kernel::WaitCurrentThread(WAITTYPE_VBLANK);
179 }
180}
181
182/// Initialize hardware
183void Init() {
184 g_last_ticks = Core::g_app_core->GetTicks();
185 SetFramebufferLocation(FRAMEBUFFER_LOCATION_FCRAM);
186 NOTICE_LOG(GPU, "initialized OK");
187}
188
189/// Shutdown hardware
190void Shutdown() {
191 NOTICE_LOG(GPU, "shutdown OK");
192}
193
194} // namespace