diff options
| author | 2014-08-12 13:55:41 +0200 | |
|---|---|---|
| committer | 2014-08-12 13:55:41 +0200 | |
| commit | 36cabe35cc15a6590f5d18be695ae505a946cb06 (patch) | |
| tree | 241e6d8b36e6ab9921ef7afb71e7350e52862e2a /src/core/hle | |
| parent | Merge pull request #38 from neobrain/replace_registerset (diff) | |
| parent | Pica: Add basic rasterizer. (diff) | |
| download | yuzu-36cabe35cc15a6590f5d18be695ae505a946cb06.tar.gz yuzu-36cabe35cc15a6590f5d18be695ae505a946cb06.tar.xz yuzu-36cabe35cc15a6590f5d18be695ae505a946cb06.zip | |
Merge pull request #37 from neobrain/pica
Initial work on Pica rendering.
Diffstat (limited to 'src/core/hle')
| -rw-r--r-- | src/core/hle/service/gsp.cpp | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/src/core/hle/service/gsp.cpp b/src/core/hle/service/gsp.cpp index 08e65612e..635f50a53 100644 --- a/src/core/hle/service/gsp.cpp +++ b/src/core/hle/service/gsp.cpp | |||
| @@ -32,7 +32,7 @@ static inline u8* GetCommandBuffer(u32 thread_id) { | |||
| 32 | if (0 == g_shared_memory) | 32 | if (0 == g_shared_memory) |
| 33 | return nullptr; | 33 | return nullptr; |
| 34 | 34 | ||
| 35 | return Kernel::GetSharedMemoryPointer(g_shared_memory, | 35 | return Kernel::GetSharedMemoryPointer(g_shared_memory, |
| 36 | 0x800 + (thread_id * sizeof(CommandBuffer))); | 36 | 0x800 + (thread_id * sizeof(CommandBuffer))); |
| 37 | } | 37 | } |
| 38 | 38 | ||
| @@ -173,7 +173,7 @@ void ExecuteCommand(const Command& command) { | |||
| 173 | case CommandId::SET_COMMAND_LIST_LAST: | 173 | case CommandId::SET_COMMAND_LIST_LAST: |
| 174 | { | 174 | { |
| 175 | auto& params = command.set_command_list_last; | 175 | auto& params = command.set_command_list_last; |
| 176 | WriteGPURegister(GPU_REG_INDEX(command_processor_config.address), params.address >> 3); | 176 | WriteGPURegister(GPU_REG_INDEX(command_processor_config.address), Memory::VirtualToPhysicalAddress(params.address) >> 3); |
| 177 | WriteGPURegister(GPU_REG_INDEX(command_processor_config.size), params.size >> 3); | 177 | WriteGPURegister(GPU_REG_INDEX(command_processor_config.size), params.size >> 3); |
| 178 | 178 | ||
| 179 | // TODO: Not sure if we are supposed to always write this .. seems to trigger processing though | 179 | // TODO: Not sure if we are supposed to always write this .. seems to trigger processing though |
| @@ -193,20 +193,28 @@ void ExecuteCommand(const Command& command) { | |||
| 193 | case CommandId::SET_MEMORY_FILL: | 193 | case CommandId::SET_MEMORY_FILL: |
| 194 | { | 194 | { |
| 195 | auto& params = command.memory_fill; | 195 | auto& params = command.memory_fill; |
| 196 | WriteGPURegister(GPU_REG_INDEX(memory_fill_config[0].address_start), params.start1 >> 3); | 196 | WriteGPURegister(GPU_REG_INDEX(memory_fill_config[0].address_start), Memory::VirtualToPhysicalAddress(params.start1) >> 3); |
| 197 | WriteGPURegister(GPU_REG_INDEX(memory_fill_config[0].address_end), params.end1 >> 3); | 197 | WriteGPURegister(GPU_REG_INDEX(memory_fill_config[0].address_end), Memory::VirtualToPhysicalAddress(params.end1) >> 3); |
| 198 | WriteGPURegister(GPU_REG_INDEX(memory_fill_config[0].size), params.end1 - params.start1); | 198 | WriteGPURegister(GPU_REG_INDEX(memory_fill_config[0].size), params.end1 - params.start1); |
| 199 | WriteGPURegister(GPU_REG_INDEX(memory_fill_config[0].value), params.value1); | 199 | WriteGPURegister(GPU_REG_INDEX(memory_fill_config[0].value), params.value1); |
| 200 | 200 | ||
| 201 | WriteGPURegister(GPU_REG_INDEX(memory_fill_config[1].address_start), params.start2 >> 3); | 201 | WriteGPURegister(GPU_REG_INDEX(memory_fill_config[1].address_start), Memory::VirtualToPhysicalAddress(params.start2) >> 3); |
| 202 | WriteGPURegister(GPU_REG_INDEX(memory_fill_config[1].address_end), params.end2 >> 3); | 202 | WriteGPURegister(GPU_REG_INDEX(memory_fill_config[1].address_end), Memory::VirtualToPhysicalAddress(params.end2) >> 3); |
| 203 | WriteGPURegister(GPU_REG_INDEX(memory_fill_config[1].size), params.end2 - params.start2); | 203 | WriteGPURegister(GPU_REG_INDEX(memory_fill_config[1].size), params.end2 - params.start2); |
| 204 | WriteGPURegister(GPU_REG_INDEX(memory_fill_config[1].value), params.value2); | 204 | WriteGPURegister(GPU_REG_INDEX(memory_fill_config[1].value), params.value2); |
| 205 | break; | 205 | break; |
| 206 | } | 206 | } |
| 207 | 207 | ||
| 208 | // TODO: Check if texture copies are implemented correctly.. | ||
| 209 | case CommandId::SET_DISPLAY_TRANSFER: | 208 | case CommandId::SET_DISPLAY_TRANSFER: |
| 209 | { | ||
| 210 | auto& params = command.image_copy; | ||
| 211 | WriteGPURegister(GPU_REG_INDEX(display_transfer_config.input_address), Memory::VirtualToPhysicalAddress(params.in_buffer_address) >> 3); | ||
| 212 | WriteGPURegister(GPU_REG_INDEX(display_transfer_config.output_address), Memory::VirtualToPhysicalAddress(params.out_buffer_address) >> 3); | ||
| 213 | WriteGPURegister(GPU_REG_INDEX(display_transfer_config.input_size), params.in_buffer_size); | ||
| 214 | WriteGPURegister(GPU_REG_INDEX(display_transfer_config.output_size), params.out_buffer_size); | ||
| 215 | WriteGPURegister(GPU_REG_INDEX(display_transfer_config.flags), params.flags); | ||
| 216 | WriteGPURegister(GPU_REG_INDEX(display_transfer_config.trigger), 1); | ||
| 217 | |||
| 210 | // TODO(bunnei): Signalling all of these interrupts here is totally wrong, but it seems to | 218 | // TODO(bunnei): Signalling all of these interrupts here is totally wrong, but it seems to |
| 211 | // work well enough for running demos. Need to figure out how these all work and trigger | 219 | // work well enough for running demos. Need to figure out how these all work and trigger |
| 212 | // them correctly. | 220 | // them correctly. |
| @@ -216,18 +224,19 @@ void ExecuteCommand(const Command& command) { | |||
| 216 | SignalInterrupt(InterruptId::P3D); | 224 | SignalInterrupt(InterruptId::P3D); |
| 217 | SignalInterrupt(InterruptId::DMA); | 225 | SignalInterrupt(InterruptId::DMA); |
| 218 | break; | 226 | break; |
| 227 | } | ||
| 219 | 228 | ||
| 229 | // TODO: Check if texture copies are implemented correctly.. | ||
| 220 | case CommandId::SET_TEXTURE_COPY: | 230 | case CommandId::SET_TEXTURE_COPY: |
| 221 | { | 231 | { |
| 222 | auto& params = command.image_copy; | 232 | auto& params = command.image_copy; |
| 223 | WriteGPURegister(GPU_REG_INDEX(display_transfer_config.input_address), params.in_buffer_address >> 3); | 233 | WriteGPURegister(GPU_REG_INDEX(display_transfer_config.input_address), Memory::VirtualToPhysicalAddress(params.in_buffer_address) >> 3); |
| 224 | WriteGPURegister(GPU_REG_INDEX(display_transfer_config.output_address), params.out_buffer_address >> 3); | 234 | WriteGPURegister(GPU_REG_INDEX(display_transfer_config.output_address), Memory::VirtualToPhysicalAddress(params.out_buffer_address) >> 3); |
| 225 | WriteGPURegister(GPU_REG_INDEX(display_transfer_config.input_size), params.in_buffer_size); | 235 | WriteGPURegister(GPU_REG_INDEX(display_transfer_config.input_size), params.in_buffer_size); |
| 226 | WriteGPURegister(GPU_REG_INDEX(display_transfer_config.output_size), params.out_buffer_size); | 236 | WriteGPURegister(GPU_REG_INDEX(display_transfer_config.output_size), params.out_buffer_size); |
| 227 | WriteGPURegister(GPU_REG_INDEX(display_transfer_config.flags), params.flags); | 237 | WriteGPURegister(GPU_REG_INDEX(display_transfer_config.flags), params.flags); |
| 228 | 238 | ||
| 229 | // TODO: Should this only be ORed with 1 for texture copies? | 239 | // TODO: Should this register be set to 1 or should instead its value be OR-ed with 1? |
| 230 | // trigger transfer | ||
| 231 | WriteGPURegister(GPU_REG_INDEX(display_transfer_config.trigger), 1); | 240 | WriteGPURegister(GPU_REG_INDEX(display_transfer_config.trigger), 1); |
| 232 | break; | 241 | break; |
| 233 | } | 242 | } |