diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/citra/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/citra_qt/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/citra_qt/debugger/graphics_breakpoints.cpp | 4 | ||||
| -rw-r--r-- | src/common/assert.h | 2 | ||||
| -rw-r--r-- | src/core/hle/service/am/am.cpp | 2 | ||||
| -rw-r--r-- | src/core/hle/service/y2r_u.cpp | 480 | ||||
| -rw-r--r-- | src/core/hle/service/y2r_u.h | 20 | ||||
| -rw-r--r-- | src/video_core/debug_utils/debug_utils.cpp | 5 | ||||
| -rw-r--r-- | src/video_core/debug_utils/debug_utils.h | 16 | ||||
| -rw-r--r-- | src/video_core/shader/shader_jit_x64.cpp | 6 |
10 files changed, 455 insertions, 84 deletions
diff --git a/src/citra/CMakeLists.txt b/src/citra/CMakeLists.txt index 351752c1c..43fa06b4e 100644 --- a/src/citra/CMakeLists.txt +++ b/src/citra/CMakeLists.txt | |||
| @@ -21,7 +21,7 @@ target_link_libraries(citra ${SDL2_LIBRARY} ${OPENGL_gl_LIBRARY} inih glad) | |||
| 21 | if (MSVC) | 21 | if (MSVC) |
| 22 | target_link_libraries(citra getopt) | 22 | target_link_libraries(citra getopt) |
| 23 | endif() | 23 | endif() |
| 24 | target_link_libraries(citra ${PLATFORM_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT}) | 24 | target_link_libraries(citra ${PLATFORM_LIBRARIES} Threads::Threads) |
| 25 | 25 | ||
| 26 | if(${CMAKE_SYSTEM_NAME} MATCHES "Linux|FreeBSD|OpenBSD|NetBSD") | 26 | if(${CMAKE_SYSTEM_NAME} MATCHES "Linux|FreeBSD|OpenBSD|NetBSD") |
| 27 | install(TARGETS citra RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}/bin") | 27 | install(TARGETS citra RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}/bin") |
diff --git a/src/citra_qt/CMakeLists.txt b/src/citra_qt/CMakeLists.txt index 6660d9879..cc9e0c624 100644 --- a/src/citra_qt/CMakeLists.txt +++ b/src/citra_qt/CMakeLists.txt | |||
| @@ -92,7 +92,7 @@ else() | |||
| 92 | endif() | 92 | endif() |
| 93 | target_link_libraries(citra-qt core video_core audio_core common qhexedit) | 93 | target_link_libraries(citra-qt core video_core audio_core common qhexedit) |
| 94 | target_link_libraries(citra-qt ${OPENGL_gl_LIBRARY} ${CITRA_QT_LIBS}) | 94 | target_link_libraries(citra-qt ${OPENGL_gl_LIBRARY} ${CITRA_QT_LIBS}) |
| 95 | target_link_libraries(citra-qt ${PLATFORM_LIBRARIES}) | 95 | target_link_libraries(citra-qt ${PLATFORM_LIBRARIES} Threads::Threads) |
| 96 | 96 | ||
| 97 | if(${CMAKE_SYSTEM_NAME} MATCHES "Linux|FreeBSD|OpenBSD|NetBSD") | 97 | if(${CMAKE_SYSTEM_NAME} MATCHES "Linux|FreeBSD|OpenBSD|NetBSD") |
| 98 | install(TARGETS citra-qt RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}/bin") | 98 | install(TARGETS citra-qt RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}/bin") |
diff --git a/src/citra_qt/debugger/graphics_breakpoints.cpp b/src/citra_qt/debugger/graphics_breakpoints.cpp index 819ec7707..c8510128a 100644 --- a/src/citra_qt/debugger/graphics_breakpoints.cpp +++ b/src/citra_qt/debugger/graphics_breakpoints.cpp | |||
| @@ -75,7 +75,7 @@ QVariant BreakPointModel::data(const QModelIndex& index, int role) const | |||
| 75 | case Role_IsEnabled: | 75 | case Role_IsEnabled: |
| 76 | { | 76 | { |
| 77 | auto context = context_weak.lock(); | 77 | auto context = context_weak.lock(); |
| 78 | return context && context->breakpoints[event].enabled; | 78 | return context && context->breakpoints[(int)event].enabled; |
| 79 | } | 79 | } |
| 80 | 80 | ||
| 81 | default: | 81 | default: |
| @@ -110,7 +110,7 @@ bool BreakPointModel::setData(const QModelIndex& index, const QVariant& value, i | |||
| 110 | if (!context) | 110 | if (!context) |
| 111 | return false; | 111 | return false; |
| 112 | 112 | ||
| 113 | context->breakpoints[event].enabled = value == Qt::Checked; | 113 | context->breakpoints[(int)event].enabled = value == Qt::Checked; |
| 114 | QModelIndex changed_index = createIndex(index.row(), 0); | 114 | QModelIndex changed_index = createIndex(index.row(), 0); |
| 115 | emit dataChanged(changed_index, changed_index); | 115 | emit dataChanged(changed_index, changed_index); |
| 116 | return true; | 116 | return true; |
diff --git a/src/common/assert.h b/src/common/assert.h index d7f19f5eb..cd9b819a9 100644 --- a/src/common/assert.h +++ b/src/common/assert.h | |||
| @@ -39,7 +39,7 @@ static void assert_noinline_call(const Fn& fn) { | |||
| 39 | }); } while (0) | 39 | }); } while (0) |
| 40 | 40 | ||
| 41 | #define UNREACHABLE() ASSERT_MSG(false, "Unreachable code!") | 41 | #define UNREACHABLE() ASSERT_MSG(false, "Unreachable code!") |
| 42 | #define UNREACHABLE_MSG(_a_, ...) ASSERT_MSG(false, _a_, __VA_ARGS__) | 42 | #define UNREACHABLE_MSG(...) ASSERT_MSG(false, __VA_ARGS__) |
| 43 | 43 | ||
| 44 | #ifdef _DEBUG | 44 | #ifdef _DEBUG |
| 45 | #define DEBUG_ASSERT(_a_) ASSERT(_a_) | 45 | #define DEBUG_ASSERT(_a_) ASSERT(_a_) |
diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index 9591522e5..3f71e7f2b 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp | |||
| @@ -43,7 +43,7 @@ void FindContentInfos(Service::Interface* self) { | |||
| 43 | am_content_count[media_type] = cmd_buff[4]; | 43 | am_content_count[media_type] = cmd_buff[4]; |
| 44 | 44 | ||
| 45 | cmd_buff[1] = RESULT_SUCCESS.raw; | 45 | cmd_buff[1] = RESULT_SUCCESS.raw; |
| 46 | LOG_WARNING(Service_AM, "(STUBBED) media_type=%u, title_id=0x%016lx, content_cound=%u, content_ids_pointer=0x%08x, content_info_pointer=0x%08x", | 46 | LOG_WARNING(Service_AM, "(STUBBED) media_type=%u, title_id=0x%016llx, content_cound=%u, content_ids_pointer=0x%08x, content_info_pointer=0x%08x", |
| 47 | media_type, title_id, am_content_count[media_type], content_ids_pointer, content_info_pointer); | 47 | media_type, title_id, am_content_count[media_type], content_ids_pointer, content_info_pointer); |
| 48 | } | 48 | } |
| 49 | 49 | ||
diff --git a/src/core/hle/service/y2r_u.cpp b/src/core/hle/service/y2r_u.cpp index 1672ad775..d16578f87 100644 --- a/src/core/hle/service/y2r_u.cpp +++ b/src/core/hle/service/y2r_u.cpp | |||
| @@ -4,6 +4,7 @@ | |||
| 4 | 4 | ||
| 5 | #include <cstring> | 5 | #include <cstring> |
| 6 | 6 | ||
| 7 | #include "common/common_funcs.h" | ||
| 7 | #include "common/common_types.h" | 8 | #include "common/common_types.h" |
| 8 | #include "common/logging/log.h" | 9 | #include "common/logging/log.h" |
| 9 | 10 | ||
| @@ -25,13 +26,17 @@ struct ConversionParameters { | |||
| 25 | u16 input_line_width; | 26 | u16 input_line_width; |
| 26 | u16 input_lines; | 27 | u16 input_lines; |
| 27 | StandardCoefficient standard_coefficient; | 28 | StandardCoefficient standard_coefficient; |
| 28 | u8 reserved; | 29 | u8 padding; |
| 29 | u16 alpha; | 30 | u16 alpha; |
| 30 | }; | 31 | }; |
| 31 | static_assert(sizeof(ConversionParameters) == 12, "ConversionParameters struct has incorrect size"); | 32 | static_assert(sizeof(ConversionParameters) == 12, "ConversionParameters struct has incorrect size"); |
| 32 | 33 | ||
| 33 | static Kernel::SharedPtr<Kernel::Event> completion_event; | 34 | static Kernel::SharedPtr<Kernel::Event> completion_event; |
| 34 | static ConversionConfiguration conversion; | 35 | static ConversionConfiguration conversion; |
| 36 | static DitheringWeightParams dithering_weight_params; | ||
| 37 | static u32 temporal_dithering_enabled = 0; | ||
| 38 | static u32 transfer_end_interrupt_enabled = 0; | ||
| 39 | static u32 spacial_dithering_enabled = 0; | ||
| 35 | 40 | ||
| 36 | static const CoefficientSet standard_coefficients[4] = { | 41 | static const CoefficientSet standard_coefficients[4] = { |
| 37 | {{ 0x100, 0x166, 0xB6, 0x58, 0x1C5, -0x166F, 0x10EE, -0x1C5B }}, // ITU_Rec601 | 42 | {{ 0x100, 0x166, 0xB6, 0x58, 0x1C5, -0x166F, 0x10EE, -0x1C5B }}, // ITU_Rec601 |
| @@ -70,7 +75,7 @@ ResultCode ConversionConfiguration::SetInputLines(u16 lines) { | |||
| 70 | 75 | ||
| 71 | ResultCode ConversionConfiguration::SetStandardCoefficient(StandardCoefficient standard_coefficient) { | 76 | ResultCode ConversionConfiguration::SetStandardCoefficient(StandardCoefficient standard_coefficient) { |
| 72 | size_t index = static_cast<size_t>(standard_coefficient); | 77 | size_t index = static_cast<size_t>(standard_coefficient); |
| 73 | if (index >= 4) { | 78 | if (index >= ARRAY_SIZE(standard_coefficients)) { |
| 74 | return ResultCode(ErrorDescription::InvalidEnumValue, ErrorModule::CAM, | 79 | return ResultCode(ErrorDescription::InvalidEnumValue, ErrorModule::CAM, |
| 75 | ErrorSummary::InvalidArgument, ErrorLevel::Usage); // 0xE0E053ED | 80 | ErrorSummary::InvalidArgument, ErrorLevel::Usage); // 0xE0E053ED |
| 76 | } | 81 | } |
| @@ -83,44 +88,183 @@ static void SetInputFormat(Service::Interface* self) { | |||
| 83 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 88 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 84 | 89 | ||
| 85 | conversion.input_format = static_cast<InputFormat>(cmd_buff[1]); | 90 | conversion.input_format = static_cast<InputFormat>(cmd_buff[1]); |
| 91 | |||
| 92 | cmd_buff[0] = IPC::MakeHeader(0x1, 1, 0); | ||
| 93 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 94 | |||
| 86 | LOG_DEBUG(Service_Y2R, "called input_format=%hhu", conversion.input_format); | 95 | LOG_DEBUG(Service_Y2R, "called input_format=%hhu", conversion.input_format); |
| 96 | } | ||
| 87 | 97 | ||
| 98 | static void GetInputFormat(Service::Interface* self) { | ||
| 99 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 100 | |||
| 101 | cmd_buff[0] = IPC::MakeHeader(0x2, 2, 0); | ||
| 88 | cmd_buff[1] = RESULT_SUCCESS.raw; | 102 | cmd_buff[1] = RESULT_SUCCESS.raw; |
| 103 | cmd_buff[2] = static_cast<u32>(conversion.input_format); | ||
| 104 | |||
| 105 | LOG_DEBUG(Service_Y2R, "called input_format=%hhu", conversion.input_format); | ||
| 89 | } | 106 | } |
| 90 | 107 | ||
| 91 | static void SetOutputFormat(Service::Interface* self) { | 108 | static void SetOutputFormat(Service::Interface* self) { |
| 92 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 109 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 93 | 110 | ||
| 94 | conversion.output_format = static_cast<OutputFormat>(cmd_buff[1]); | 111 | conversion.output_format = static_cast<OutputFormat>(cmd_buff[1]); |
| 112 | |||
| 113 | cmd_buff[0] = IPC::MakeHeader(0x3, 1, 0); | ||
| 114 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 115 | |||
| 95 | LOG_DEBUG(Service_Y2R, "called output_format=%hhu", conversion.output_format); | 116 | LOG_DEBUG(Service_Y2R, "called output_format=%hhu", conversion.output_format); |
| 117 | } | ||
| 118 | |||
| 119 | static void GetOutputFormat(Service::Interface* self) { | ||
| 120 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 96 | 121 | ||
| 122 | cmd_buff[0] = IPC::MakeHeader(0x4, 2, 0); | ||
| 97 | cmd_buff[1] = RESULT_SUCCESS.raw; | 123 | cmd_buff[1] = RESULT_SUCCESS.raw; |
| 124 | cmd_buff[2] = static_cast<u32>(conversion.output_format); | ||
| 125 | |||
| 126 | LOG_DEBUG(Service_Y2R, "called output_format=%hhu", conversion.output_format); | ||
| 98 | } | 127 | } |
| 99 | 128 | ||
| 100 | static void SetRotation(Service::Interface* self) { | 129 | static void SetRotation(Service::Interface* self) { |
| 101 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 130 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 102 | 131 | ||
| 103 | conversion.rotation = static_cast<Rotation>(cmd_buff[1]); | 132 | conversion.rotation = static_cast<Rotation>(cmd_buff[1]); |
| 133 | |||
| 134 | cmd_buff[0] = IPC::MakeHeader(0x5, 1, 0); | ||
| 135 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 136 | |||
| 104 | LOG_DEBUG(Service_Y2R, "called rotation=%hhu", conversion.rotation); | 137 | LOG_DEBUG(Service_Y2R, "called rotation=%hhu", conversion.rotation); |
| 138 | } | ||
| 139 | |||
| 140 | static void GetRotation(Service::Interface* self) { | ||
| 141 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 105 | 142 | ||
| 143 | cmd_buff[0] = IPC::MakeHeader(0x6, 2, 0); | ||
| 106 | cmd_buff[1] = RESULT_SUCCESS.raw; | 144 | cmd_buff[1] = RESULT_SUCCESS.raw; |
| 145 | cmd_buff[2] = static_cast<u32>(conversion.rotation); | ||
| 146 | |||
| 147 | LOG_DEBUG(Service_Y2R, "called rotation=%hhu", conversion.rotation); | ||
| 107 | } | 148 | } |
| 108 | 149 | ||
| 109 | static void SetBlockAlignment(Service::Interface* self) { | 150 | static void SetBlockAlignment(Service::Interface* self) { |
| 110 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 151 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 111 | 152 | ||
| 112 | conversion.block_alignment = static_cast<BlockAlignment>(cmd_buff[1]); | 153 | conversion.block_alignment = static_cast<BlockAlignment>(cmd_buff[1]); |
| 113 | LOG_DEBUG(Service_Y2R, "called alignment=%hhu", conversion.block_alignment); | ||
| 114 | 154 | ||
| 155 | cmd_buff[0] = IPC::MakeHeader(0x7, 1, 0); | ||
| 156 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 157 | |||
| 158 | LOG_DEBUG(Service_Y2R, "called block_alignment=%hhu", conversion.block_alignment); | ||
| 159 | } | ||
| 160 | |||
| 161 | static void GetBlockAlignment(Service::Interface* self) { | ||
| 162 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 163 | |||
| 164 | cmd_buff[0] = IPC::MakeHeader(0x8, 2, 0); | ||
| 165 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 166 | cmd_buff[2] = static_cast<u32>(conversion.block_alignment); | ||
| 167 | |||
| 168 | LOG_DEBUG(Service_Y2R, "called block_alignment=%hhu", conversion.block_alignment); | ||
| 169 | } | ||
| 170 | |||
| 171 | /** | ||
| 172 | * Y2R_U::SetSpacialDithering service function | ||
| 173 | * Inputs: | ||
| 174 | * 1 : u8, 0 = Disabled, 1 = Enabled | ||
| 175 | * Outputs: | ||
| 176 | * 1 : Result of function, 0 on success, otherwise error code | ||
| 177 | */ | ||
| 178 | static void SetSpacialDithering(Service::Interface* self) { | ||
| 179 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 180 | spacial_dithering_enabled = cmd_buff[1] & 0xF; | ||
| 181 | |||
| 182 | cmd_buff[0] = IPC::MakeHeader(0x9, 1, 0); | ||
| 183 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 184 | |||
| 185 | LOG_WARNING(Service_Y2R, "(STUBBED) called"); | ||
| 186 | } | ||
| 187 | |||
| 188 | /** | ||
| 189 | * Y2R_U::GetSpacialDithering service function | ||
| 190 | * Outputs: | ||
| 191 | * 1 : Result of function, 0 on success, otherwise error code | ||
| 192 | * 2 : u8, 0 = Disabled, 1 = Enabled | ||
| 193 | */ | ||
| 194 | static void GetSpacialDithering(Service::Interface* self) { | ||
| 195 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 196 | |||
| 197 | cmd_buff[0] = IPC::MakeHeader(0xA, 2, 0); | ||
| 198 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 199 | cmd_buff[2] = spacial_dithering_enabled; | ||
| 200 | |||
| 201 | LOG_WARNING(Service_Y2R, "(STUBBED) called"); | ||
| 202 | } | ||
| 203 | |||
| 204 | /** | ||
| 205 | * Y2R_U::SetTemporalDithering service function | ||
| 206 | * Inputs: | ||
| 207 | * 1 : u8, 0 = Disabled, 1 = Enabled | ||
| 208 | * Outputs: | ||
| 209 | * 1 : Result of function, 0 on success, otherwise error code | ||
| 210 | */ | ||
| 211 | static void SetTemporalDithering(Service::Interface* self) { | ||
| 212 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 213 | temporal_dithering_enabled = cmd_buff[1] & 0xF; | ||
| 214 | |||
| 215 | cmd_buff[0] = IPC::MakeHeader(0xB, 1, 0); | ||
| 216 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 217 | |||
| 218 | LOG_WARNING(Service_Y2R, "(STUBBED) called"); | ||
| 219 | } | ||
| 220 | |||
| 221 | /** | ||
| 222 | * Y2R_U::GetTemporalDithering service function | ||
| 223 | * Outputs: | ||
| 224 | * 1 : Result of function, 0 on success, otherwise error code | ||
| 225 | * 2 : u8, 0 = Disabled, 1 = Enabled | ||
| 226 | */ | ||
| 227 | static void GetTemporalDithering(Service::Interface* self) { | ||
| 228 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 229 | |||
| 230 | cmd_buff[0] = IPC::MakeHeader(0xC, 2, 0); | ||
| 115 | cmd_buff[1] = RESULT_SUCCESS.raw; | 231 | cmd_buff[1] = RESULT_SUCCESS.raw; |
| 232 | cmd_buff[2] = temporal_dithering_enabled; | ||
| 233 | |||
| 234 | LOG_WARNING(Service_Y2R, "(STUBBED) called"); | ||
| 116 | } | 235 | } |
| 117 | 236 | ||
| 237 | /** | ||
| 238 | * Y2R_U::SetTransferEndInterrupt service function | ||
| 239 | * Inputs: | ||
| 240 | * 1 : u8, 0 = Disabled, 1 = Enabled | ||
| 241 | * Outputs: | ||
| 242 | * 1 : Result of function, 0 on success, otherwise error code | ||
| 243 | */ | ||
| 118 | static void SetTransferEndInterrupt(Service::Interface* self) { | 244 | static void SetTransferEndInterrupt(Service::Interface* self) { |
| 119 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 245 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 246 | transfer_end_interrupt_enabled = cmd_buff[1] & 0xf; | ||
| 120 | 247 | ||
| 121 | cmd_buff[0] = IPC::MakeHeader(0xD, 1, 0); | 248 | cmd_buff[0] = IPC::MakeHeader(0xD, 1, 0); |
| 122 | cmd_buff[1] = RESULT_SUCCESS.raw; | 249 | cmd_buff[1] = RESULT_SUCCESS.raw; |
| 123 | LOG_DEBUG(Service_Y2R, "(STUBBED) called"); | 250 | |
| 251 | LOG_WARNING(Service_Y2R, "(STUBBED) called"); | ||
| 252 | } | ||
| 253 | |||
| 254 | /** | ||
| 255 | * Y2R_U::GetTransferEndInterrupt service function | ||
| 256 | * Outputs: | ||
| 257 | * 1 : Result of function, 0 on success, otherwise error code | ||
| 258 | * 2 : u8, 0 = Disabled, 1 = Enabled | ||
| 259 | */ | ||
| 260 | static void GetTransferEndInterrupt(Service::Interface* self) { | ||
| 261 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 262 | |||
| 263 | cmd_buff[0] = IPC::MakeHeader(0xE, 2, 0); | ||
| 264 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 265 | cmd_buff[2] = transfer_end_interrupt_enabled; | ||
| 266 | |||
| 267 | LOG_WARNING(Service_Y2R, "(STUBBED) called"); | ||
| 124 | } | 268 | } |
| 125 | 269 | ||
| 126 | /** | 270 | /** |
| @@ -132,8 +276,10 @@ static void SetTransferEndInterrupt(Service::Interface* self) { | |||
| 132 | static void GetTransferEndEvent(Service::Interface* self) { | 276 | static void GetTransferEndEvent(Service::Interface* self) { |
| 133 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 277 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 134 | 278 | ||
| 279 | cmd_buff[0] = IPC::MakeHeader(0xF, 2, 0); | ||
| 135 | cmd_buff[1] = RESULT_SUCCESS.raw; | 280 | cmd_buff[1] = RESULT_SUCCESS.raw; |
| 136 | cmd_buff[3] = Kernel::g_handle_table.Create(completion_event).MoveFrom(); | 281 | cmd_buff[3] = Kernel::g_handle_table.Create(completion_event).MoveFrom(); |
| 282 | |||
| 137 | LOG_DEBUG(Service_Y2R, "called"); | 283 | LOG_DEBUG(Service_Y2R, "called"); |
| 138 | } | 284 | } |
| 139 | 285 | ||
| @@ -144,12 +290,12 @@ static void SetSendingY(Service::Interface* self) { | |||
| 144 | conversion.src_Y.image_size = cmd_buff[2]; | 290 | conversion.src_Y.image_size = cmd_buff[2]; |
| 145 | conversion.src_Y.transfer_unit = cmd_buff[3]; | 291 | conversion.src_Y.transfer_unit = cmd_buff[3]; |
| 146 | conversion.src_Y.gap = cmd_buff[4]; | 292 | conversion.src_Y.gap = cmd_buff[4]; |
| 147 | u32 src_process_handle = cmd_buff[6]; | ||
| 148 | LOG_DEBUG(Service_Y2R, "called image_size=0x%08X, transfer_unit=%hu, transfer_stride=%hu, " | ||
| 149 | "src_process_handle=0x%08X", conversion.src_Y.image_size, | ||
| 150 | conversion.src_Y.transfer_unit, conversion.src_Y.gap, src_process_handle); | ||
| 151 | 293 | ||
| 294 | cmd_buff[0] = IPC::MakeHeader(0x10, 1, 0); | ||
| 152 | cmd_buff[1] = RESULT_SUCCESS.raw; | 295 | cmd_buff[1] = RESULT_SUCCESS.raw; |
| 296 | |||
| 297 | LOG_DEBUG(Service_Y2R, "called image_size=0x%08X, transfer_unit=%hu, transfer_stride=%hu, src_process_handle=0x%08X", | ||
| 298 | conversion.src_Y.image_size, conversion.src_Y.transfer_unit, conversion.src_Y.gap, cmd_buff[6]); | ||
| 153 | } | 299 | } |
| 154 | 300 | ||
| 155 | static void SetSendingU(Service::Interface* self) { | 301 | static void SetSendingU(Service::Interface* self) { |
| @@ -159,12 +305,12 @@ static void SetSendingU(Service::Interface* self) { | |||
| 159 | conversion.src_U.image_size = cmd_buff[2]; | 305 | conversion.src_U.image_size = cmd_buff[2]; |
| 160 | conversion.src_U.transfer_unit = cmd_buff[3]; | 306 | conversion.src_U.transfer_unit = cmd_buff[3]; |
| 161 | conversion.src_U.gap = cmd_buff[4]; | 307 | conversion.src_U.gap = cmd_buff[4]; |
| 162 | u32 src_process_handle = cmd_buff[6]; | ||
| 163 | LOG_DEBUG(Service_Y2R, "called image_size=0x%08X, transfer_unit=%hu, transfer_stride=%hu, " | ||
| 164 | "src_process_handle=0x%08X", conversion.src_U.image_size, | ||
| 165 | conversion.src_U.transfer_unit, conversion.src_U.gap, src_process_handle); | ||
| 166 | 308 | ||
| 309 | cmd_buff[0] = IPC::MakeHeader(0x11, 1, 0); | ||
| 167 | cmd_buff[1] = RESULT_SUCCESS.raw; | 310 | cmd_buff[1] = RESULT_SUCCESS.raw; |
| 311 | |||
| 312 | LOG_DEBUG(Service_Y2R, "called image_size=0x%08X, transfer_unit=%hu, transfer_stride=%hu, src_process_handle=0x%08X", | ||
| 313 | conversion.src_U.image_size, conversion.src_U.transfer_unit, conversion.src_U.gap, cmd_buff[6]); | ||
| 168 | } | 314 | } |
| 169 | 315 | ||
| 170 | static void SetSendingV(Service::Interface* self) { | 316 | static void SetSendingV(Service::Interface* self) { |
| @@ -174,12 +320,12 @@ static void SetSendingV(Service::Interface* self) { | |||
| 174 | conversion.src_V.image_size = cmd_buff[2]; | 320 | conversion.src_V.image_size = cmd_buff[2]; |
| 175 | conversion.src_V.transfer_unit = cmd_buff[3]; | 321 | conversion.src_V.transfer_unit = cmd_buff[3]; |
| 176 | conversion.src_V.gap = cmd_buff[4]; | 322 | conversion.src_V.gap = cmd_buff[4]; |
| 177 | u32 src_process_handle = cmd_buff[6]; | ||
| 178 | LOG_DEBUG(Service_Y2R, "called image_size=0x%08X, transfer_unit=%hu, transfer_stride=%hu, " | ||
| 179 | "src_process_handle=0x%08X", conversion.src_V.image_size, | ||
| 180 | conversion.src_V.transfer_unit, conversion.src_V.gap, src_process_handle); | ||
| 181 | 323 | ||
| 324 | cmd_buff[0] = IPC::MakeHeader(0x12, 1, 0); | ||
| 182 | cmd_buff[1] = RESULT_SUCCESS.raw; | 325 | cmd_buff[1] = RESULT_SUCCESS.raw; |
| 326 | |||
| 327 | LOG_DEBUG(Service_Y2R, "called image_size=0x%08X, transfer_unit=%hu, transfer_stride=%hu, src_process_handle=0x%08X", | ||
| 328 | conversion.src_V.image_size, conversion.src_V.transfer_unit, conversion.src_V.gap, cmd_buff[6]); | ||
| 183 | } | 329 | } |
| 184 | 330 | ||
| 185 | static void SetSendingYUYV(Service::Interface* self) { | 331 | static void SetSendingYUYV(Service::Interface* self) { |
| @@ -189,12 +335,76 @@ static void SetSendingYUYV(Service::Interface* self) { | |||
| 189 | conversion.src_YUYV.image_size = cmd_buff[2]; | 335 | conversion.src_YUYV.image_size = cmd_buff[2]; |
| 190 | conversion.src_YUYV.transfer_unit = cmd_buff[3]; | 336 | conversion.src_YUYV.transfer_unit = cmd_buff[3]; |
| 191 | conversion.src_YUYV.gap = cmd_buff[4]; | 337 | conversion.src_YUYV.gap = cmd_buff[4]; |
| 192 | u32 src_process_handle = cmd_buff[6]; | ||
| 193 | LOG_DEBUG(Service_Y2R, "called image_size=0x%08X, transfer_unit=%hu, transfer_stride=%hu, " | ||
| 194 | "src_process_handle=0x%08X", conversion.src_YUYV.image_size, | ||
| 195 | conversion.src_YUYV.transfer_unit, conversion.src_YUYV.gap, src_process_handle); | ||
| 196 | 338 | ||
| 339 | cmd_buff[0] = IPC::MakeHeader(0x13, 1, 0); | ||
| 340 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 341 | |||
| 342 | LOG_DEBUG(Service_Y2R, "called image_size=0x%08X, transfer_unit=%hu, transfer_stride=%hu, src_process_handle=0x%08X", | ||
| 343 | conversion.src_YUYV.image_size, conversion.src_YUYV.transfer_unit, conversion.src_YUYV.gap, cmd_buff[6]); | ||
| 344 | } | ||
| 345 | |||
| 346 | /** | ||
| 347 | * Y2R::IsFinishedSendingYuv service function | ||
| 348 | * Output: | ||
| 349 | * 1 : Result of the function, 0 on success, otherwise error code | ||
| 350 | * 2 : u8, 0 = Not Finished, 1 = Finished | ||
| 351 | */ | ||
| 352 | static void IsFinishedSendingYuv(Service::Interface* self) { | ||
| 353 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 354 | |||
| 355 | cmd_buff[0] = IPC::MakeHeader(0x14, 2, 0); | ||
| 197 | cmd_buff[1] = RESULT_SUCCESS.raw; | 356 | cmd_buff[1] = RESULT_SUCCESS.raw; |
| 357 | cmd_buff[2] = 1; | ||
| 358 | |||
| 359 | LOG_WARNING(Service_Y2R, "(STUBBED) called"); | ||
| 360 | } | ||
| 361 | |||
| 362 | /** | ||
| 363 | * Y2R::IsFinishedSendingY service function | ||
| 364 | * Output: | ||
| 365 | * 1 : Result of the function, 0 on success, otherwise error code | ||
| 366 | * 2 : u8, 0 = Not Finished, 1 = Finished | ||
| 367 | */ | ||
| 368 | static void IsFinishedSendingY(Service::Interface* self) { | ||
| 369 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 370 | |||
| 371 | cmd_buff[0] = IPC::MakeHeader(0x15, 2, 0); | ||
| 372 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 373 | cmd_buff[2] = 1; | ||
| 374 | |||
| 375 | LOG_WARNING(Service_Y2R, "(STUBBED) called"); | ||
| 376 | } | ||
| 377 | |||
| 378 | /** | ||
| 379 | * Y2R::IsFinishedSendingU service function | ||
| 380 | * Output: | ||
| 381 | * 1 : Result of the function, 0 on success, otherwise error code | ||
| 382 | * 2 : u8, 0 = Not Finished, 1 = Finished | ||
| 383 | */ | ||
| 384 | static void IsFinishedSendingU(Service::Interface* self) { | ||
| 385 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 386 | |||
| 387 | cmd_buff[0] = IPC::MakeHeader(0x16, 2, 0); | ||
| 388 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 389 | cmd_buff[2] = 1; | ||
| 390 | |||
| 391 | LOG_WARNING(Service_Y2R, "(STUBBED) called"); | ||
| 392 | } | ||
| 393 | |||
| 394 | /** | ||
| 395 | * Y2R::IsFinishedSendingV service function | ||
| 396 | * Output: | ||
| 397 | * 1 : Result of the function, 0 on success, otherwise error code | ||
| 398 | * 2 : u8, 0 = Not Finished, 1 = Finished | ||
| 399 | */ | ||
| 400 | static void IsFinishedSendingV(Service::Interface* self) { | ||
| 401 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 402 | |||
| 403 | cmd_buff[0] = IPC::MakeHeader(0x17, 2, 0); | ||
| 404 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 405 | cmd_buff[2] = 1; | ||
| 406 | |||
| 407 | LOG_WARNING(Service_Y2R, "(STUBBED) called"); | ||
| 198 | } | 408 | } |
| 199 | 409 | ||
| 200 | static void SetReceiving(Service::Interface* self) { | 410 | static void SetReceiving(Service::Interface* self) { |
| @@ -204,27 +414,66 @@ static void SetReceiving(Service::Interface* self) { | |||
| 204 | conversion.dst.image_size = cmd_buff[2]; | 414 | conversion.dst.image_size = cmd_buff[2]; |
| 205 | conversion.dst.transfer_unit = cmd_buff[3]; | 415 | conversion.dst.transfer_unit = cmd_buff[3]; |
| 206 | conversion.dst.gap = cmd_buff[4]; | 416 | conversion.dst.gap = cmd_buff[4]; |
| 207 | u32 dst_process_handle = cmd_buff[6]; | ||
| 208 | LOG_DEBUG(Service_Y2R, "called image_size=0x%08X, transfer_unit=%hu, transfer_stride=%hu, " | ||
| 209 | "dst_process_handle=0x%08X", conversion.dst.image_size, | ||
| 210 | conversion.dst.transfer_unit, conversion.dst.gap, | ||
| 211 | dst_process_handle); | ||
| 212 | 417 | ||
| 418 | cmd_buff[0] = IPC::MakeHeader(0x18, 1, 0); | ||
| 419 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 420 | |||
| 421 | LOG_DEBUG(Service_Y2R, "called image_size=0x%08X, transfer_unit=%hu, transfer_stride=%hu, dst_process_handle=0x%08X", | ||
| 422 | conversion.dst.image_size, conversion.dst.transfer_unit, conversion.dst.gap, cmd_buff[6]); | ||
| 423 | } | ||
| 424 | |||
| 425 | /** | ||
| 426 | * Y2R::IsFinishedReceiving service function | ||
| 427 | * Output: | ||
| 428 | * 1 : Result of the function, 0 on success, otherwise error code | ||
| 429 | * 2 : u8, 0 = Not Finished, 1 = Finished | ||
| 430 | */ | ||
| 431 | static void IsFinishedReceiving(Service::Interface* self) { | ||
| 432 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 433 | |||
| 434 | cmd_buff[0] = IPC::MakeHeader(0x19, 2, 0); | ||
| 213 | cmd_buff[1] = RESULT_SUCCESS.raw; | 435 | cmd_buff[1] = RESULT_SUCCESS.raw; |
| 436 | cmd_buff[2] = 1; | ||
| 437 | |||
| 438 | LOG_WARNING(Service_Y2R, "(STUBBED) called"); | ||
| 214 | } | 439 | } |
| 215 | 440 | ||
| 216 | static void SetInputLineWidth(Service::Interface* self) { | 441 | static void SetInputLineWidth(Service::Interface* self) { |
| 217 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 442 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 218 | 443 | ||
| 219 | LOG_DEBUG(Service_Y2R, "called input_line_width=%u", cmd_buff[1]); | 444 | cmd_buff[0] = IPC::MakeHeader(0x1A, 1, 0); |
| 220 | cmd_buff[1] = conversion.SetInputLineWidth(cmd_buff[1]).raw; | 445 | cmd_buff[1] = conversion.SetInputLineWidth(cmd_buff[1]).raw; |
| 446 | |||
| 447 | LOG_DEBUG(Service_Y2R, "called input_line_width=%u", cmd_buff[1]); | ||
| 448 | } | ||
| 449 | |||
| 450 | static void GetInputLineWidth(Service::Interface* self) { | ||
| 451 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 452 | |||
| 453 | cmd_buff[0] = IPC::MakeHeader(0x1B, 2, 0); | ||
| 454 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 455 | cmd_buff[2] = conversion.input_line_width; | ||
| 456 | |||
| 457 | LOG_DEBUG(Service_Y2R, "called input_line_width=%u", conversion.input_line_width); | ||
| 221 | } | 458 | } |
| 222 | 459 | ||
| 223 | static void SetInputLines(Service::Interface* self) { | 460 | static void SetInputLines(Service::Interface* self) { |
| 224 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 461 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 225 | 462 | ||
| 226 | LOG_DEBUG(Service_Y2R, "called input_line_number=%u", cmd_buff[1]); | 463 | cmd_buff[0] = IPC::MakeHeader(0x1C, 1, 0); |
| 227 | cmd_buff[1] = conversion.SetInputLines(cmd_buff[1]).raw; | 464 | cmd_buff[1] = conversion.SetInputLines(cmd_buff[1]).raw; |
| 465 | |||
| 466 | LOG_DEBUG(Service_Y2R, "called input_lines=%u", cmd_buff[1]); | ||
| 467 | } | ||
| 468 | |||
| 469 | static void GetInputLines(Service::Interface* self) { | ||
| 470 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 471 | |||
| 472 | cmd_buff[0] = IPC::MakeHeader(0x1D, 2, 0); | ||
| 473 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 474 | cmd_buff[2] = static_cast<u32>(conversion.input_lines); | ||
| 475 | |||
| 476 | LOG_DEBUG(Service_Y2R, "called input_lines=%u", conversion.input_lines); | ||
| 228 | } | 477 | } |
| 229 | 478 | ||
| 230 | static void SetCoefficient(Service::Interface* self) { | 479 | static void SetCoefficient(Service::Interface* self) { |
| @@ -232,44 +481,111 @@ static void SetCoefficient(Service::Interface* self) { | |||
| 232 | 481 | ||
| 233 | const u16* coefficients = reinterpret_cast<const u16*>(&cmd_buff[1]); | 482 | const u16* coefficients = reinterpret_cast<const u16*>(&cmd_buff[1]); |
| 234 | std::memcpy(conversion.coefficients.data(), coefficients, sizeof(CoefficientSet)); | 483 | std::memcpy(conversion.coefficients.data(), coefficients, sizeof(CoefficientSet)); |
| 484 | |||
| 485 | cmd_buff[0] = IPC::MakeHeader(0x1E, 1, 0); | ||
| 486 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 487 | |||
| 235 | LOG_DEBUG(Service_Y2R, "called coefficients=[%hX, %hX, %hX, %hX, %hX, %hX, %hX, %hX]", | 488 | LOG_DEBUG(Service_Y2R, "called coefficients=[%hX, %hX, %hX, %hX, %hX, %hX, %hX, %hX]", |
| 236 | coefficients[0], coefficients[1], coefficients[2], coefficients[3], | 489 | coefficients[0], coefficients[1], coefficients[2], coefficients[3], |
| 237 | coefficients[4], coefficients[5], coefficients[6], coefficients[7]); | 490 | coefficients[4], coefficients[5], coefficients[6], coefficients[7]); |
| 491 | } | ||
| 492 | |||
| 493 | static void GetCoefficient(Service::Interface* self) { | ||
| 494 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 238 | 495 | ||
| 496 | cmd_buff[0] = IPC::MakeHeader(0x1F, 5, 0); | ||
| 239 | cmd_buff[1] = RESULT_SUCCESS.raw; | 497 | cmd_buff[1] = RESULT_SUCCESS.raw; |
| 498 | std::memcpy(&cmd_buff[2], conversion.coefficients.data(), sizeof(CoefficientSet)); | ||
| 499 | |||
| 500 | LOG_DEBUG(Service_Y2R, "called"); | ||
| 240 | } | 501 | } |
| 241 | 502 | ||
| 242 | static void SetStandardCoefficient(Service::Interface* self) { | 503 | static void SetStandardCoefficient(Service::Interface* self) { |
| 243 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 504 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 244 | 505 | ||
| 245 | LOG_DEBUG(Service_Y2R, "called standard_coefficient=%u", cmd_buff[1]); | 506 | u32 index = cmd_buff[1]; |
| 507 | |||
| 508 | cmd_buff[0] = IPC::MakeHeader(0x20, 1, 0); | ||
| 509 | cmd_buff[1] = conversion.SetStandardCoefficient((StandardCoefficient)index).raw; | ||
| 246 | 510 | ||
| 247 | cmd_buff[1] = conversion.SetStandardCoefficient((StandardCoefficient)cmd_buff[1]).raw; | 511 | LOG_DEBUG(Service_Y2R, "called standard_coefficient=%u", index); |
| 512 | } | ||
| 513 | |||
| 514 | static void GetStandardCoefficient(Service::Interface* self) { | ||
| 515 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 516 | |||
| 517 | u32 index = cmd_buff[1]; | ||
| 518 | |||
| 519 | if (index < ARRAY_SIZE(standard_coefficients)) { | ||
| 520 | cmd_buff[0] = IPC::MakeHeader(0x21, 5, 0); | ||
| 521 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 522 | std::memcpy(&cmd_buff[2], &standard_coefficients[index], sizeof(CoefficientSet)); | ||
| 523 | |||
| 524 | LOG_DEBUG(Service_Y2R, "called standard_coefficient=%u ", index); | ||
| 525 | } else { | ||
| 526 | cmd_buff[0] = IPC::MakeHeader(0x21, 1, 0); | ||
| 527 | cmd_buff[1] = -1; // TODO(bunnei): Identify the correct error code for this | ||
| 528 | |||
| 529 | LOG_ERROR(Service_Y2R, "called standard_coefficient=%u The argument is invalid!", index); | ||
| 530 | } | ||
| 248 | } | 531 | } |
| 249 | 532 | ||
| 250 | static void SetAlpha(Service::Interface* self) { | 533 | static void SetAlpha(Service::Interface* self) { |
| 251 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 534 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 252 | 535 | ||
| 253 | conversion.alpha = cmd_buff[1]; | 536 | conversion.alpha = cmd_buff[1]; |
| 537 | |||
| 538 | cmd_buff[0] = IPC::MakeHeader(0x22, 1, 0); | ||
| 539 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 540 | |||
| 541 | LOG_DEBUG(Service_Y2R, "called alpha=%hu", conversion.alpha); | ||
| 542 | } | ||
| 543 | |||
| 544 | static void GetAlpha(Service::Interface* self) { | ||
| 545 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 546 | |||
| 547 | cmd_buff[0] = IPC::MakeHeader(0x23, 2, 0); | ||
| 548 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 549 | cmd_buff[2] = conversion.alpha; | ||
| 550 | |||
| 254 | LOG_DEBUG(Service_Y2R, "called alpha=%hu", conversion.alpha); | 551 | LOG_DEBUG(Service_Y2R, "called alpha=%hu", conversion.alpha); |
| 552 | } | ||
| 553 | |||
| 554 | static void SetDitheringWeightParams(Service::Interface* self) { | ||
| 555 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 556 | std::memcpy(&dithering_weight_params, &cmd_buff[1], sizeof(DitheringWeightParams)); | ||
| 255 | 557 | ||
| 558 | cmd_buff[0] = IPC::MakeHeader(0x24, 1, 0); | ||
| 256 | cmd_buff[1] = RESULT_SUCCESS.raw; | 559 | cmd_buff[1] = RESULT_SUCCESS.raw; |
| 560 | |||
| 561 | LOG_DEBUG(Service_Y2R, "called"); | ||
| 562 | } | ||
| 563 | |||
| 564 | static void GetDitheringWeightParams(Service::Interface* self) { | ||
| 565 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 566 | |||
| 567 | cmd_buff[0] = IPC::MakeHeader(0x25, 9, 0); | ||
| 568 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 569 | std::memcpy(&cmd_buff[2], &dithering_weight_params, sizeof(DitheringWeightParams)); | ||
| 570 | |||
| 571 | LOG_DEBUG(Service_Y2R, "called"); | ||
| 257 | } | 572 | } |
| 258 | 573 | ||
| 259 | static void StartConversion(Service::Interface* self) { | 574 | static void StartConversion(Service::Interface* self) { |
| 260 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 575 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 261 | 576 | ||
| 262 | // dst_image_size would seem to be perfect for this, but it doesn't include the gap :( | 577 | // dst_image_size would seem to be perfect for this, but it doesn't include the gap :( |
| 263 | u32 total_output_size = conversion.input_lines * | 578 | u32 total_output_size = conversion.input_lines * (conversion.dst.transfer_unit + conversion.dst.gap); |
| 264 | (conversion.dst.transfer_unit + conversion.dst.gap); | ||
| 265 | Memory::RasterizerFlushAndInvalidateRegion(Memory::VirtualToPhysicalAddress(conversion.dst.address), total_output_size); | 579 | Memory::RasterizerFlushAndInvalidateRegion(Memory::VirtualToPhysicalAddress(conversion.dst.address), total_output_size); |
| 266 | 580 | ||
| 267 | HW::Y2R::PerformConversion(conversion); | 581 | HW::Y2R::PerformConversion(conversion); |
| 268 | 582 | ||
| 269 | LOG_DEBUG(Service_Y2R, "called"); | ||
| 270 | completion_event->Signal(); | 583 | completion_event->Signal(); |
| 271 | 584 | ||
| 585 | cmd_buff[0] = IPC::MakeHeader(0x26, 1, 0); | ||
| 272 | cmd_buff[1] = RESULT_SUCCESS.raw; | 586 | cmd_buff[1] = RESULT_SUCCESS.raw; |
| 587 | |||
| 588 | LOG_DEBUG(Service_Y2R, "called"); | ||
| 273 | } | 589 | } |
| 274 | 590 | ||
| 275 | static void StopConversion(Service::Interface* self) { | 591 | static void StopConversion(Service::Interface* self) { |
| @@ -277,6 +593,7 @@ static void StopConversion(Service::Interface* self) { | |||
| 277 | 593 | ||
| 278 | cmd_buff[0] = IPC::MakeHeader(0x27, 1, 0); | 594 | cmd_buff[0] = IPC::MakeHeader(0x27, 1, 0); |
| 279 | cmd_buff[1] = RESULT_SUCCESS.raw; | 595 | cmd_buff[1] = RESULT_SUCCESS.raw; |
| 596 | |||
| 280 | LOG_DEBUG(Service_Y2R, "called"); | 597 | LOG_DEBUG(Service_Y2R, "called"); |
| 281 | } | 598 | } |
| 282 | 599 | ||
| @@ -289,50 +606,61 @@ static void StopConversion(Service::Interface* self) { | |||
| 289 | static void IsBusyConversion(Service::Interface* self) { | 606 | static void IsBusyConversion(Service::Interface* self) { |
| 290 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 607 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 291 | 608 | ||
| 609 | cmd_buff[0] = IPC::MakeHeader(0x28, 2, 0); | ||
| 292 | cmd_buff[1] = RESULT_SUCCESS.raw; | 610 | cmd_buff[1] = RESULT_SUCCESS.raw; |
| 293 | cmd_buff[2] = 0; // StartConversion always finishes immediately | 611 | cmd_buff[2] = 0; // StartConversion always finishes immediately |
| 612 | |||
| 294 | LOG_DEBUG(Service_Y2R, "called"); | 613 | LOG_DEBUG(Service_Y2R, "called"); |
| 295 | } | 614 | } |
| 296 | 615 | ||
| 297 | /** | 616 | /** |
| 298 | * Y2R_U::SetConversionParams service function | 617 | * Y2R_U::SetPackageParameter service function |
| 299 | */ | 618 | */ |
| 300 | static void SetConversionParams(Service::Interface* self) { | 619 | static void SetPackageParameter(Service::Interface* self) { |
| 301 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 620 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 302 | 621 | ||
| 303 | auto params = reinterpret_cast<const ConversionParameters*>(&cmd_buff[1]); | 622 | auto params = reinterpret_cast<const ConversionParameters*>(&cmd_buff[1]); |
| 304 | LOG_DEBUG(Service_Y2R, | ||
| 305 | "called input_format=%hhu output_format=%hhu rotation=%hhu block_alignment=%hhu " | ||
| 306 | "input_line_width=%hu input_lines=%hu standard_coefficient=%hhu " | ||
| 307 | "reserved=%hhu alpha=%hX", | ||
| 308 | params->input_format, params->output_format, params->rotation, params->block_alignment, | ||
| 309 | params->input_line_width, params->input_lines, params->standard_coefficient, | ||
| 310 | params->reserved, params->alpha); | ||
| 311 | |||
| 312 | ResultCode result = RESULT_SUCCESS; | ||
| 313 | 623 | ||
| 314 | conversion.input_format = params->input_format; | 624 | conversion.input_format = params->input_format; |
| 315 | conversion.output_format = params->output_format; | 625 | conversion.output_format = params->output_format; |
| 316 | conversion.rotation = params->rotation; | 626 | conversion.rotation = params->rotation; |
| 317 | conversion.block_alignment = params->block_alignment; | 627 | conversion.block_alignment = params->block_alignment; |
| 318 | result = conversion.SetInputLineWidth(params->input_line_width); | 628 | |
| 319 | if (result.IsError()) goto cleanup; | 629 | ResultCode result = conversion.SetInputLineWidth(params->input_line_width); |
| 630 | |||
| 631 | if (result.IsError()) | ||
| 632 | goto cleanup; | ||
| 633 | |||
| 320 | result = conversion.SetInputLines(params->input_lines); | 634 | result = conversion.SetInputLines(params->input_lines); |
| 321 | if (result.IsError()) goto cleanup; | 635 | |
| 636 | if (result.IsError()) | ||
| 637 | goto cleanup; | ||
| 638 | |||
| 322 | result = conversion.SetStandardCoefficient(params->standard_coefficient); | 639 | result = conversion.SetStandardCoefficient(params->standard_coefficient); |
| 323 | if (result.IsError()) goto cleanup; | 640 | |
| 641 | if (result.IsError()) | ||
| 642 | goto cleanup; | ||
| 643 | |||
| 644 | conversion.padding = params->padding; | ||
| 324 | conversion.alpha = params->alpha; | 645 | conversion.alpha = params->alpha; |
| 325 | 646 | ||
| 326 | cleanup: | 647 | cleanup: |
| 327 | cmd_buff[0] = IPC::MakeHeader(0x29, 1, 0); | 648 | cmd_buff[0] = IPC::MakeHeader(0x29, 1, 0); |
| 328 | cmd_buff[1] = result.raw; | 649 | cmd_buff[1] = result.raw; |
| 650 | |||
| 651 | LOG_DEBUG(Service_Y2R, "called input_format=%hhu output_format=%hhu rotation=%hhu block_alignment=%hhu " | ||
| 652 | "input_line_width=%hu input_lines=%hu standard_coefficient=%hhu reserved=%hhu alpha=%hX", | ||
| 653 | params->input_format, params->output_format, params->rotation, params->block_alignment, | ||
| 654 | params->input_line_width, params->input_lines, params->standard_coefficient, params->padding, params->alpha); | ||
| 329 | } | 655 | } |
| 330 | 656 | ||
| 331 | static void PingProcess(Service::Interface* self) { | 657 | static void PingProcess(Service::Interface* self) { |
| 332 | u32* cmd_buff = Kernel::GetCommandBuffer(); | 658 | u32* cmd_buff = Kernel::GetCommandBuffer(); |
| 333 | 659 | ||
| 660 | cmd_buff[0] = IPC::MakeHeader(0x2A, 2, 0); | ||
| 334 | cmd_buff[1] = RESULT_SUCCESS.raw; | 661 | cmd_buff[1] = RESULT_SUCCESS.raw; |
| 335 | cmd_buff[2] = 0; | 662 | cmd_buff[2] = 0; |
| 663 | |||
| 336 | LOG_WARNING(Service_Y2R, "(STUBBED) called"); | 664 | LOG_WARNING(Service_Y2R, "(STUBBED) called"); |
| 337 | } | 665 | } |
| 338 | 666 | ||
| @@ -358,6 +686,7 @@ static void DriverInitialize(Service::Interface* self) { | |||
| 358 | 686 | ||
| 359 | cmd_buff[0] = IPC::MakeHeader(0x2B, 1, 0); | 687 | cmd_buff[0] = IPC::MakeHeader(0x2B, 1, 0); |
| 360 | cmd_buff[1] = RESULT_SUCCESS.raw; | 688 | cmd_buff[1] = RESULT_SUCCESS.raw; |
| 689 | |||
| 361 | LOG_DEBUG(Service_Y2R, "called"); | 690 | LOG_DEBUG(Service_Y2R, "called"); |
| 362 | } | 691 | } |
| 363 | 692 | ||
| @@ -366,54 +695,67 @@ static void DriverFinalize(Service::Interface* self) { | |||
| 366 | 695 | ||
| 367 | cmd_buff[0] = IPC::MakeHeader(0x2C, 1, 0); | 696 | cmd_buff[0] = IPC::MakeHeader(0x2C, 1, 0); |
| 368 | cmd_buff[1] = RESULT_SUCCESS.raw; | 697 | cmd_buff[1] = RESULT_SUCCESS.raw; |
| 698 | |||
| 699 | LOG_DEBUG(Service_Y2R, "called"); | ||
| 700 | } | ||
| 701 | |||
| 702 | |||
| 703 | static void GetPackageParameter(Service::Interface* self) { | ||
| 704 | u32* cmd_buff = Kernel::GetCommandBuffer(); | ||
| 705 | |||
| 706 | cmd_buff[0] = IPC::MakeHeader(0x2D, 4, 0); | ||
| 707 | cmd_buff[1] = RESULT_SUCCESS.raw; | ||
| 708 | std::memcpy(&cmd_buff[2], &conversion, sizeof(ConversionParameters)); | ||
| 709 | |||
| 369 | LOG_DEBUG(Service_Y2R, "called"); | 710 | LOG_DEBUG(Service_Y2R, "called"); |
| 370 | } | 711 | } |
| 371 | 712 | ||
| 372 | const Interface::FunctionInfo FunctionTable[] = { | 713 | const Interface::FunctionInfo FunctionTable[] = { |
| 373 | {0x00010040, SetInputFormat, "SetInputFormat"}, | 714 | {0x00010040, SetInputFormat, "SetInputFormat"}, |
| 374 | {0x00020000, nullptr, "GetInputFormat"}, | 715 | {0x00020000, GetInputFormat, "GetInputFormat"}, |
| 375 | {0x00030040, SetOutputFormat, "SetOutputFormat"}, | 716 | {0x00030040, SetOutputFormat, "SetOutputFormat"}, |
| 376 | {0x00040000, nullptr, "GetOutputFormat"}, | 717 | {0x00040000, GetOutputFormat, "GetOutputFormat"}, |
| 377 | {0x00050040, SetRotation, "SetRotation"}, | 718 | {0x00050040, SetRotation, "SetRotation"}, |
| 378 | {0x00060000, nullptr, "GetRotation"}, | 719 | {0x00060000, GetRotation, "GetRotation"}, |
| 379 | {0x00070040, SetBlockAlignment, "SetBlockAlignment"}, | 720 | {0x00070040, SetBlockAlignment, "SetBlockAlignment"}, |
| 380 | {0x00080000, nullptr, "GetBlockAlignment"}, | 721 | {0x00080000, GetBlockAlignment, "GetBlockAlignment"}, |
| 381 | {0x00090040, nullptr, "SetSpacialDithering"}, | 722 | {0x00090040, SetSpacialDithering, "SetSpacialDithering"}, |
| 382 | {0x000A0000, nullptr, "GetSpacialDithering"}, | 723 | {0x000A0000, GetSpacialDithering, "GetSpacialDithering"}, |
| 383 | {0x000B0040, nullptr, "SetTemporalDithering"}, | 724 | {0x000B0040, SetTemporalDithering, "SetTemporalDithering"}, |
| 384 | {0x000C0000, nullptr, "GetTemporalDithering"}, | 725 | {0x000C0000, GetTemporalDithering, "GetTemporalDithering"}, |
| 385 | {0x000D0040, SetTransferEndInterrupt, "SetTransferEndInterrupt"}, | 726 | {0x000D0040, SetTransferEndInterrupt, "SetTransferEndInterrupt"}, |
| 727 | {0x000E0000, GetTransferEndInterrupt, "GetTransferEndInterrupt"}, | ||
| 386 | {0x000F0000, GetTransferEndEvent, "GetTransferEndEvent"}, | 728 | {0x000F0000, GetTransferEndEvent, "GetTransferEndEvent"}, |
| 387 | {0x00100102, SetSendingY, "SetSendingY"}, | 729 | {0x00100102, SetSendingY, "SetSendingY"}, |
| 388 | {0x00110102, SetSendingU, "SetSendingU"}, | 730 | {0x00110102, SetSendingU, "SetSendingU"}, |
| 389 | {0x00120102, SetSendingV, "SetSendingV"}, | 731 | {0x00120102, SetSendingV, "SetSendingV"}, |
| 390 | {0x00130102, SetSendingYUYV, "SetSendingYUYV"}, | 732 | {0x00130102, SetSendingYUYV, "SetSendingYUYV"}, |
| 391 | {0x00140000, nullptr, "IsFinishedSendingYuv"}, | 733 | {0x00140000, IsFinishedSendingYuv, "IsFinishedSendingYuv"}, |
| 392 | {0x00150000, nullptr, "IsFinishedSendingY"}, | 734 | {0x00150000, IsFinishedSendingY, "IsFinishedSendingY"}, |
| 393 | {0x00160000, nullptr, "IsFinishedSendingU"}, | 735 | {0x00160000, IsFinishedSendingU, "IsFinishedSendingU"}, |
| 394 | {0x00170000, nullptr, "IsFinishedSendingV"}, | 736 | {0x00170000, IsFinishedSendingV, "IsFinishedSendingV"}, |
| 395 | {0x00180102, SetReceiving, "SetReceiving"}, | 737 | {0x00180102, SetReceiving, "SetReceiving"}, |
| 396 | {0x00190000, nullptr, "IsFinishedReceiving"}, | 738 | {0x00190000, IsFinishedReceiving, "IsFinishedReceiving"}, |
| 397 | {0x001A0040, SetInputLineWidth, "SetInputLineWidth"}, | 739 | {0x001A0040, SetInputLineWidth, "SetInputLineWidth"}, |
| 398 | {0x001B0000, nullptr, "GetInputLineWidth"}, | 740 | {0x001B0000, GetInputLineWidth, "GetInputLineWidth"}, |
| 399 | {0x001C0040, SetInputLines, "SetInputLines"}, | 741 | {0x001C0040, SetInputLines, "SetInputLines"}, |
| 400 | {0x001D0000, nullptr, "GetInputLines"}, | 742 | {0x001D0000, GetInputLines, "GetInputLines"}, |
| 401 | {0x001E0100, SetCoefficient, "SetCoefficient"}, | 743 | {0x001E0100, SetCoefficient, "SetCoefficient"}, |
| 402 | {0x001F0000, nullptr, "GetCoefficient"}, | 744 | {0x001F0000, GetCoefficient, "GetCoefficient"}, |
| 403 | {0x00200040, SetStandardCoefficient, "SetStandardCoefficient"}, | 745 | {0x00200040, SetStandardCoefficient, "SetStandardCoefficient"}, |
| 404 | {0x00210040, nullptr, "GetStandardCoefficientParams"}, | 746 | {0x00210040, GetStandardCoefficient, "GetStandardCoefficient"}, |
| 405 | {0x00220040, SetAlpha, "SetAlpha"}, | 747 | {0x00220040, SetAlpha, "SetAlpha"}, |
| 406 | {0x00230000, nullptr, "GetAlpha"}, | 748 | {0x00230000, GetAlpha, "GetAlpha"}, |
| 407 | {0x00240200, nullptr, "SetDitheringWeightParams"}, | 749 | {0x00240200, SetDitheringWeightParams,"SetDitheringWeightParams"}, |
| 408 | {0x00250000, nullptr, "GetDitheringWeightParams"}, | 750 | {0x00250000, GetDitheringWeightParams,"GetDitheringWeightParams"}, |
| 409 | {0x00260000, StartConversion, "StartConversion"}, | 751 | {0x00260000, StartConversion, "StartConversion"}, |
| 410 | {0x00270000, StopConversion, "StopConversion"}, | 752 | {0x00270000, StopConversion, "StopConversion"}, |
| 411 | {0x00280000, IsBusyConversion, "IsBusyConversion"}, | 753 | {0x00280000, IsBusyConversion, "IsBusyConversion"}, |
| 412 | {0x002901C0, SetConversionParams, "SetConversionParams"}, | 754 | {0x002901C0, SetPackageParameter, "SetPackageParameter"}, |
| 413 | {0x002A0000, PingProcess, "PingProcess"}, | 755 | {0x002A0000, PingProcess, "PingProcess"}, |
| 414 | {0x002B0000, DriverInitialize, "DriverInitialize"}, | 756 | {0x002B0000, DriverInitialize, "DriverInitialize"}, |
| 415 | {0x002C0000, DriverFinalize, "DriverFinalize"}, | 757 | {0x002C0000, DriverFinalize, "DriverFinalize"}, |
| 416 | {0x002D0000, nullptr, "GetPackageParameter"}, | 758 | {0x002D0000, GetPackageParameter, "GetPackageParameter"}, |
| 417 | }; | 759 | }; |
| 418 | 760 | ||
| 419 | //////////////////////////////////////////////////////////////////////////////////////////////////// | 761 | //////////////////////////////////////////////////////////////////////////////////////////////////// |
diff --git a/src/core/hle/service/y2r_u.h b/src/core/hle/service/y2r_u.h index 3965a5545..95fa2fdb7 100644 --- a/src/core/hle/service/y2r_u.h +++ b/src/core/hle/service/y2r_u.h | |||
| @@ -97,6 +97,7 @@ struct ConversionConfiguration { | |||
| 97 | u16 input_line_width; | 97 | u16 input_line_width; |
| 98 | u16 input_lines; | 98 | u16 input_lines; |
| 99 | CoefficientSet coefficients; | 99 | CoefficientSet coefficients; |
| 100 | u8 padding; | ||
| 100 | u16 alpha; | 101 | u16 alpha; |
| 101 | 102 | ||
| 102 | /// Input parameters for the Y (luma) plane | 103 | /// Input parameters for the Y (luma) plane |
| @@ -109,6 +110,25 @@ struct ConversionConfiguration { | |||
| 109 | ResultCode SetStandardCoefficient(StandardCoefficient standard_coefficient); | 110 | ResultCode SetStandardCoefficient(StandardCoefficient standard_coefficient); |
| 110 | }; | 111 | }; |
| 111 | 112 | ||
| 113 | struct DitheringWeightParams { | ||
| 114 | u16 w0_xEven_yEven; | ||
| 115 | u16 w0_xOdd_yEven; | ||
| 116 | u16 w0_xEven_yOdd; | ||
| 117 | u16 w0_xOdd_yOdd; | ||
| 118 | u16 w1_xEven_yEven; | ||
| 119 | u16 w1_xOdd_yEven; | ||
| 120 | u16 w1_xEven_yOdd; | ||
| 121 | u16 w1_xOdd_yOdd; | ||
| 122 | u16 w2_xEven_yEven; | ||
| 123 | u16 w2_xOdd_yEven; | ||
| 124 | u16 w2_xEven_yOdd; | ||
| 125 | u16 w2_xOdd_yOdd; | ||
| 126 | u16 w3_xEven_yEven; | ||
| 127 | u16 w3_xOdd_yEven; | ||
| 128 | u16 w3_xEven_yOdd; | ||
| 129 | u16 w3_xOdd_yOdd; | ||
| 130 | }; | ||
| 131 | |||
| 112 | class Interface : public Service::Interface { | 132 | class Interface : public Service::Interface { |
| 113 | public: | 133 | public: |
| 114 | Interface(); | 134 | Interface(); |
diff --git a/src/video_core/debug_utils/debug_utils.cpp b/src/video_core/debug_utils/debug_utils.cpp index 1f058c4e2..178a566f7 100644 --- a/src/video_core/debug_utils/debug_utils.cpp +++ b/src/video_core/debug_utils/debug_utils.cpp | |||
| @@ -40,10 +40,7 @@ using nihstro::DVLPHeader; | |||
| 40 | 40 | ||
| 41 | namespace Pica { | 41 | namespace Pica { |
| 42 | 42 | ||
| 43 | void DebugContext::OnEvent(Event event, void* data) { | 43 | void DebugContext::DoOnEvent(Event event, void* data) { |
| 44 | if (!breakpoints[event].enabled) | ||
| 45 | return; | ||
| 46 | |||
| 47 | { | 44 | { |
| 48 | std::unique_lock<std::mutex> lock(breakpoint_mutex); | 45 | std::unique_lock<std::mutex> lock(breakpoint_mutex); |
| 49 | 46 | ||
diff --git a/src/video_core/debug_utils/debug_utils.h b/src/video_core/debug_utils/debug_utils.h index 7df941619..56f9bd958 100644 --- a/src/video_core/debug_utils/debug_utils.h +++ b/src/video_core/debug_utils/debug_utils.h | |||
| @@ -114,7 +114,15 @@ public: | |||
| 114 | * @param event Event which has happened | 114 | * @param event Event which has happened |
| 115 | * @param data Optional data pointer (pass nullptr if unused). Needs to remain valid until Resume() is called. | 115 | * @param data Optional data pointer (pass nullptr if unused). Needs to remain valid until Resume() is called. |
| 116 | */ | 116 | */ |
| 117 | void OnEvent(Event event, void* data); | 117 | void OnEvent(Event event, void* data) { |
| 118 | // This check is left in the header to allow the compiler to inline it. | ||
| 119 | if (!breakpoints[(int)event].enabled) | ||
| 120 | return; | ||
| 121 | // For the rest of event handling, call a separate function. | ||
| 122 | DoOnEvent(event, data); | ||
| 123 | } | ||
| 124 | |||
| 125 | void DoOnEvent(Event event, void *data); | ||
| 118 | 126 | ||
| 119 | /** | 127 | /** |
| 120 | * Resume from the current breakpoint. | 128 | * Resume from the current breakpoint. |
| @@ -126,12 +134,14 @@ public: | |||
| 126 | * Delete all set breakpoints and resume emulation. | 134 | * Delete all set breakpoints and resume emulation. |
| 127 | */ | 135 | */ |
| 128 | void ClearBreakpoints() { | 136 | void ClearBreakpoints() { |
| 129 | breakpoints.clear(); | 137 | for (auto &bp : breakpoints) { |
| 138 | bp.enabled = false; | ||
| 139 | } | ||
| 130 | Resume(); | 140 | Resume(); |
| 131 | } | 141 | } |
| 132 | 142 | ||
| 133 | // TODO: Evaluate if access to these members should be hidden behind a public interface. | 143 | // TODO: Evaluate if access to these members should be hidden behind a public interface. |
| 134 | std::map<Event, BreakPoint> breakpoints; | 144 | std::array<BreakPoint, (int)Event::NumEvents> breakpoints; |
| 135 | Event active_breakpoint; | 145 | Event active_breakpoint; |
| 136 | bool at_breakpoint = false; | 146 | bool at_breakpoint = false; |
| 137 | 147 | ||
diff --git a/src/video_core/shader/shader_jit_x64.cpp b/src/video_core/shader/shader_jit_x64.cpp index b47d3beda..b7747fa42 100644 --- a/src/video_core/shader/shader_jit_x64.cpp +++ b/src/video_core/shader/shader_jit_x64.cpp | |||
| @@ -148,7 +148,7 @@ static Instruction GetVertexShaderInstruction(size_t offset) { | |||
| 148 | } | 148 | } |
| 149 | 149 | ||
| 150 | static void LogCritical(const char* msg) { | 150 | static void LogCritical(const char* msg) { |
| 151 | LOG_CRITICAL(HW_GPU, msg); | 151 | LOG_CRITICAL(HW_GPU, "%s", msg); |
| 152 | } | 152 | } |
| 153 | 153 | ||
| 154 | void JitShader::Compile_Assert(bool condition, const char* msg) { | 154 | void JitShader::Compile_Assert(bool condition, const char* msg) { |
| @@ -795,6 +795,8 @@ void JitShader::FindReturnOffsets() { | |||
| 795 | case OpCode::Id::CALLU: | 795 | case OpCode::Id::CALLU: |
| 796 | return_offsets.push_back(instr.flow_control.dest_offset + instr.flow_control.num_instructions); | 796 | return_offsets.push_back(instr.flow_control.dest_offset + instr.flow_control.num_instructions); |
| 797 | break; | 797 | break; |
| 798 | default: | ||
| 799 | break; | ||
| 798 | } | 800 | } |
| 799 | } | 801 | } |
| 800 | 802 | ||
| @@ -854,7 +856,7 @@ void JitShader::Compile() { | |||
| 854 | uintptr_t size = reinterpret_cast<uintptr_t>(GetCodePtr()) - reinterpret_cast<uintptr_t>(program); | 856 | uintptr_t size = reinterpret_cast<uintptr_t>(GetCodePtr()) - reinterpret_cast<uintptr_t>(program); |
| 855 | ASSERT_MSG(size <= MAX_SHADER_SIZE, "Compiled a shader that exceeds the allocated size!"); | 857 | ASSERT_MSG(size <= MAX_SHADER_SIZE, "Compiled a shader that exceeds the allocated size!"); |
| 856 | 858 | ||
| 857 | LOG_DEBUG(HW_GPU, "Compiled shader size=%d", size); | 859 | LOG_DEBUG(HW_GPU, "Compiled shader size=%lu", size); |
| 858 | } | 860 | } |
| 859 | 861 | ||
| 860 | JitShader::JitShader() { | 862 | JitShader::JitShader() { |