diff --git a/rpcs3/Emu/RSX/CgBinaryFragmentProgram.cpp b/rpcs3/Emu/RSX/CgBinaryFragmentProgram.cpp index 9c9aee7dcd..743be6817a 100644 --- a/rpcs3/Emu/RSX/CgBinaryFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/CgBinaryFragmentProgram.cpp @@ -6,7 +6,7 @@ void CgBinaryDisasm::AddCodeAsm(const std::string& code) { - assert(m_opcode < 70); + Expects(m_opcode < 70); std::string op_name = ""; if (dst.dest_reg == 63) @@ -223,7 +223,7 @@ void CgBinaryDisasm::TaskFP() { m_size = 0; u32* data = (u32*)&m_buffer[m_offset]; - assert((m_buffer_size - m_offset) % sizeof(u32) == 0); + Expects((m_buffer_size - m_offset) % sizeof(u32) == 0); for (u32 i = 0; i < (m_buffer_size - m_offset) / sizeof(u32); i++) { data[i] = se_storage::swap(data[i]); // WTF, cannot use be_t<> there? @@ -471,7 +471,7 @@ void CgBinaryDisasm::TaskFP() break; } - assert(m_step % sizeof(u32) == 0); + Ensures(m_step % sizeof(u32) == 0); data += m_step / sizeof(u32); } } \ No newline at end of file diff --git a/rpcs3/Emu/RSX/CgBinaryProgram.h b/rpcs3/Emu/RSX/CgBinaryProgram.h index f29905d225..566468ecea 100644 --- a/rpcs3/Emu/RSX/CgBinaryProgram.h +++ b/rpcs3/Emu/RSX/CgBinaryProgram.h @@ -373,7 +373,7 @@ public: m_offset = prog.ucode; u32* vdata = (u32*)&m_buffer[m_offset]; - assert((m_buffer_size - m_offset) % sizeof(u32) == 0); + Ensures((m_buffer_size - m_offset) % sizeof(u32) == 0); for (u32 i = 0; i < (m_buffer_size - m_offset) / sizeof(u32); i++) { vdata[i] = se_storage::swap(vdata[i]); // WTF, cannot use be_t<> there? diff --git a/rpcs3/Emu/RSX/CgBinaryVertexProgram.cpp b/rpcs3/Emu/RSX/CgBinaryVertexProgram.cpp index 4ebe12a0b0..a318201274 100644 --- a/rpcs3/Emu/RSX/CgBinaryVertexProgram.cpp +++ b/rpcs3/Emu/RSX/CgBinaryVertexProgram.cpp @@ -6,13 +6,13 @@ void CgBinaryDisasm::AddScaCodeDisasm(const std::string& code) { - assert(m_sca_opcode < 21); + Expects(m_sca_opcode < 21); m_arb_shader += rsx_vp_sca_op_names[m_sca_opcode] + code + " "; } void CgBinaryDisasm::AddVecCodeDisasm(const std::string& code) { - assert(m_vec_opcode < 26); + Expects(m_vec_opcode < 26); m_arb_shader += rsx_vp_vec_op_names[m_vec_opcode] + code + " "; } diff --git a/rpcs3/Emu/RSX/Common/BufferUtils.cpp b/rpcs3/Emu/RSX/Common/BufferUtils.cpp index 34526bedb8..05c4a8acdc 100644 --- a/rpcs3/Emu/RSX/Common/BufferUtils.cpp +++ b/rpcs3/Emu/RSX/Common/BufferUtils.cpp @@ -254,7 +254,7 @@ bool is_primitive_native(rsx::primitive_type draw_mode) case rsx::primitive_type::quad_strip: return false; } - throw new EXCEPTION("Wrong primitive type"); + throw EXCEPTION("Wrong primitive type"); } /** We assume that polygon is convex in polygon mode (constraints in OpenGL) @@ -289,7 +289,7 @@ size_t get_index_type_size(rsx::index_array_type type) case rsx::index_array_type::u16: return sizeof(u16); case rsx::index_array_type::u32: return sizeof(u32); } - throw new EXCEPTION("Wrong index type"); + throw EXCEPTION("Wrong index type"); } void write_index_array_for_non_indexed_non_native_primitive_to_buffer(char* dst, rsx::primitive_type draw_mode, unsigned first, unsigned count) @@ -386,7 +386,7 @@ std::tuple write_index_array_data_to_buffer_impl(gsl::span({ ptr, count }, dst, is_primitive_restart_enabled, primitive_restart_index); } - throw new EXCEPTION("Unknow draw mode"); + throw EXCEPTION("Unknow draw mode"); } std::tuple write_index_array_data_to_buffer(gsl::span dst, rsx::index_array_type type, rsx::primitive_type draw_mode, const std::vector > &first_count_arguments) diff --git a/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp index 13cf23d71d..938f0d9c5e 100644 --- a/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/Common/FragmentProgramDecompiler.cpp @@ -644,7 +644,7 @@ std::string FragmentProgramDecompiler::Decompile() if (dst.end) break; - assert(m_offset % sizeof(u32) == 0); + Ensures(m_offset % sizeof(u32) == 0); data += m_offset / sizeof(u32); } diff --git a/rpcs3/Emu/RSX/Common/ProgramStateCache.h b/rpcs3/Emu/RSX/Common/ProgramStateCache.h index 1f6e82050a..3aae330991 100644 --- a/rpcs3/Emu/RSX/Common/ProgramStateCache.h +++ b/rpcs3/Emu/RSX/Common/ProgramStateCache.h @@ -162,7 +162,7 @@ public: auto I = m_vertex_shader_cache.find(rsx_vp); if (I != m_vertex_shader_cache.end()) return I->second; - throw new EXCEPTION("Trying to get unknow transform program"); + throw EXCEPTION("Trying to get unknown transform program"); } const fragment_program_type& get_shader_program(const RSXFragmentProgram& rsx_fp) const @@ -170,7 +170,7 @@ public: auto I = m_fragment_shader_cache.find(rsx_fp); if (I != m_fragment_shader_cache.end()) return I->second; - throw new EXCEPTION("Trying to get unknow shader program"); + throw EXCEPTION("Trying to get unknown shader program"); } template diff --git a/rpcs3/Emu/RSX/Common/ShaderParam.h b/rpcs3/Emu/RSX/Common/ShaderParam.h index 02458cb1cb..c542ac8141 100644 --- a/rpcs3/Emu/RSX/Common/ShaderParam.h +++ b/rpcs3/Emu/RSX/Common/ShaderParam.h @@ -149,10 +149,7 @@ public: { auto var_blocks = fmt::split(var, { "." }); - if (var_blocks.size() == 0) - { - assert(0); - } + Expects(var_blocks.size() != 0); name = var_blocks[0]; diff --git a/rpcs3/Emu/RSX/Common/VertexProgramDecompiler.cpp b/rpcs3/Emu/RSX/Common/VertexProgramDecompiler.cpp index 3b0e156868..39f72c2674 100644 --- a/rpcs3/Emu/RSX/Common/VertexProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/Common/VertexProgramDecompiler.cpp @@ -395,7 +395,6 @@ std::string VertexProgramDecompiler::BuildCode() { lvl -= m_instructions[i].close_scopes; if (lvl < 1) lvl = 1; - //assert(lvl >= 1); for (int j = 0; j < m_instructions[i].put_close_scopes; ++j) { --lvl; diff --git a/rpcs3/Emu/RSX/Common/VertexProgramDecompiler.h b/rpcs3/Emu/RSX/Common/VertexProgramDecompiler.h index e01dc5f2ba..9ac403340d 100644 --- a/rpcs3/Emu/RSX/Common/VertexProgramDecompiler.h +++ b/rpcs3/Emu/RSX/Common/VertexProgramDecompiler.h @@ -1,6 +1,7 @@ #pragma once #include "Emu/RSX/RSXVertexProgram.h" #include +#include #include #include "ShaderParam.h" diff --git a/rpcs3/Emu/RSX/Common/surface_store.h b/rpcs3/Emu/RSX/Common/surface_store.h index 7d5448099a..41b440af38 100644 --- a/rpcs3/Emu/RSX/Common/surface_store.h +++ b/rpcs3/Emu/RSX/Common/surface_store.h @@ -2,6 +2,7 @@ #include #include "../GCM.h" +#include namespace rsx { diff --git a/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp b/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp index a6a94fffe6..c987400078 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12Buffer.cpp @@ -350,7 +350,7 @@ std::tuple> D3D12GSRe return std::make_tuple(true, index_count, upload_vertex_attributes(first_count_commands, command_list)); } - assert(draw_command == rsx::draw_command::indexed); + Expects(draw_command == rsx::draw_command::indexed); // Index count size_t index_count = get_index_count(draw_mode, gsl::narrow(get_vertex_count(first_count_commands))); diff --git a/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp b/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp index 0876e961fe..1eba50945c 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12FragmentProgramDecompiler.cpp @@ -5,6 +5,7 @@ #include "D3D12CommonDecompiler.h" #include "Emu/Memory/Memory.h" #include "Emu/System.h" +#include D3D12FragmentDecompiler::D3D12FragmentDecompiler(const RSXFragmentProgram &prog, u32& size) : FragmentProgramDecompiler(prog, size) diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp index e304861c78..c4f2e66e17 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.cpp @@ -1,17 +1,27 @@ #include "stdafx.h" #include "stdafx_d3d12.h" #ifdef _MSC_VER +#include "Utilities/Config.h" #include "D3D12GSRender.h" #include #include #include #include +#include +#include #include "d3dx12.h" #include -#include "Emu/state.h" #include "D3D12Formats.h" #include "../rsx_methods.h" +extern cfg::bool_entry g_cfg_rsx_vsync; +extern cfg::bool_entry g_cfg_rsx_debug_output; +extern cfg::bool_entry g_cfg_rsx_overlay; + +static cfg::node s_cfg_d3d12(cfg::root.video, "D3D12"); + +cfg::string_entry g_cfg_d3d12_adapter(s_cfg_d3d12, "Adapter"); + PFN_D3D12_CREATE_DEVICE wrapD3D12CreateDevice; PFN_D3D12_GET_DEBUG_INTERFACE wrapD3D12GetDebugInterface; PFN_D3D12_SERIALIZE_ROOT_SIGNATURE wrapD3D12SerializeRootSignature; @@ -33,13 +43,13 @@ HMODULE D3DCompiler; void loadD3D12FunctionPointers() { - CHECK_ASSERTION(D3D12Module = LoadLibrary(L"d3d12.dll")); + ASSERT(D3D12Module = LoadLibrary(L"d3d12.dll")); wrapD3D12CreateDevice = (PFN_D3D12_CREATE_DEVICE)GetProcAddress(D3D12Module, "D3D12CreateDevice"); wrapD3D12GetDebugInterface = (PFN_D3D12_GET_DEBUG_INTERFACE)GetProcAddress(D3D12Module, "D3D12GetDebugInterface"); wrapD3D12SerializeRootSignature = (PFN_D3D12_SERIALIZE_ROOT_SIGNATURE)GetProcAddress(D3D12Module, "D3D12SerializeRootSignature"); - CHECK_ASSERTION(D3D11Module = LoadLibrary(L"d3d11.dll")); + ASSERT(D3D11Module = LoadLibrary(L"d3d11.dll")); wrapD3D11On12CreateDevice = (PFN_D3D11ON12_CREATE_DEVICE)GetProcAddress(D3D11Module, "D3D11On12CreateDevice"); - CHECK_ASSERTION(D3DCompiler = LoadLibrary(L"d3dcompiler_47.dll")); + ASSERT(D3DCompiler = LoadLibrary(L"d3dcompiler_47.dll")); wrapD3DCompile = (pD3DCompile)GetProcAddress(D3DCompiler, "D3DCompile"); } @@ -130,9 +140,11 @@ namespace } D3D12GSRender::D3D12GSRender() - : GSRender(frame_type::DX12), m_d3d12_lib(), m_current_pso({}) + : GSRender(frame_type::DX12) + , m_d3d12_lib() + , m_current_pso({}) { - if (rpcs3::config.rsx.d3d12.debug_output.value()) + if (g_cfg_rsx_debug_output) { Microsoft::WRL::ComPtr debugInterface; wrapD3D12GetDebugInterface(IID_PPV_ARGS(&debugInterface)); @@ -141,10 +153,30 @@ D3D12GSRender::D3D12GSRender() Microsoft::WRL::ComPtr dxgi_factory; CHECK_HRESULT(CreateDXGIFactory(IID_PPV_ARGS(&dxgi_factory))); + // Create adapter - ComPtr adaptater = nullptr; - CHECK_HRESULT(dxgi_factory->EnumAdapters(rpcs3::state.config.rsx.d3d12.adaptater.value(), adaptater.GetAddressOf())); - CHECK_HRESULT(wrapD3D12CreateDevice(adaptater.Get(), D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&m_device))); + ComPtr adapter; + const std::wstring& adapter_name = std::wstring_convert>().from_bytes(g_cfg_d3d12_adapter); + + for (UINT id = 0; dxgi_factory->EnumAdapters(id, adapter.ReleaseAndGetAddressOf()) != DXGI_ERROR_NOT_FOUND; id++) + { + DXGI_ADAPTER_DESC desc; + adapter->GetDesc(&desc); + + // Adapter with specified name + if (adapter_name == desc.Description) + { + break; + } + + // Default adapter + if (id == 1 && adapter_name.empty()) + { + break; + } + } + + CHECK_HRESULT(wrapD3D12CreateDevice(adapter.Get(), D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS(&m_device))); // Queues D3D12_COMMAND_QUEUE_DESC graphic_queue_desc = { D3D12_COMMAND_LIST_TYPE_DIRECT }; @@ -224,7 +256,7 @@ D3D12GSRender::D3D12GSRender() ) ); - if (rpcs3::config.rsx.d3d12.overlay.value()) + if (g_cfg_rsx_overlay) init_d2d_structures(); } @@ -418,7 +450,7 @@ void D3D12GSRender::end() m_timers.draw_calls_duration += std::chrono::duration_cast(end_duration - start_duration).count(); m_timers.draw_calls_count++; - if (rpcs3::config.rsx.d3d12.debug_output.value()) + if (g_cfg_rsx_debug_output) { CHECK_HRESULT(get_current_resource_storage().command_list->Close()); m_command_queue->ExecuteCommandLists(1, (ID3D12CommandList**)get_current_resource_storage().command_list.GetAddressOf()); @@ -454,7 +486,7 @@ void D3D12GSRender::flip(int buffer) if (!is_flip_surface_in_global_memory(rsx::to_surface_target(rsx::method_registers[NV4097_SET_SURFACE_COLOR_TARGET]))) { resource_storage &storage = get_current_resource_storage(); - assert(storage.ram_framebuffer == nullptr); + ASSERT(storage.ram_framebuffer == nullptr); size_t w = 0, h = 0, row_pitch = 0; @@ -583,21 +615,21 @@ void D3D12GSRender::flip(int buffer) if (resource_to_flip) get_current_resource_storage().command_list->DrawInstanced(4, 1, 0, 0); - if (!rpcs3::config.rsx.d3d12.overlay.value()) + if (!g_cfg_rsx_overlay) get_current_resource_storage().command_list->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_backbuffer[m_swap_chain->GetCurrentBackBufferIndex()].Get(), D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PRESENT)); if (is_flip_surface_in_global_memory(rsx::to_surface_target(rsx::method_registers[NV4097_SET_SURFACE_COLOR_TARGET])) && resource_to_flip != nullptr) get_current_resource_storage().command_list->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(resource_to_flip, D3D12_RESOURCE_STATE_GENERIC_READ, D3D12_RESOURCE_STATE_RENDER_TARGET)); CHECK_HRESULT(get_current_resource_storage().command_list->Close()); m_command_queue->ExecuteCommandLists(1, (ID3D12CommandList**)get_current_resource_storage().command_list.GetAddressOf()); - if(rpcs3::config.rsx.d3d12.overlay.value()) + if (g_cfg_rsx_overlay) render_overlay(); reset_timer(); std::chrono::time_point flip_start = std::chrono::system_clock::now(); - CHECK_HRESULT(m_swap_chain->Present(rpcs3::state.config.rsx.vsync.value() ? 1 : 0, 0)); + CHECK_HRESULT(m_swap_chain->Present(g_cfg_rsx_vsync ? 1 : 0, 0)); // Add an event signaling queue completion resource_storage &storage = get_non_current_resource_storage(); diff --git a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h index 51dd134cfe..ff995241a2 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12GSRender.h @@ -1,7 +1,6 @@ #pragma once #include "D3D12Utils.h" -#include "Utilities/rPlatform.h" // only for rImage #include "Emu/Memory/Memory.h" #include "Emu/System.h" #include "Emu/RSX/GSRender.h" diff --git a/rpcs3/Emu/RSX/D3D12/D3D12MemoryHelpers.h b/rpcs3/Emu/RSX/D3D12/D3D12MemoryHelpers.h index 24290d5b91..2de6ee913b 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12MemoryHelpers.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12MemoryHelpers.h @@ -2,6 +2,7 @@ #include "D3D12Utils.h" #include "d3dx12.h" #include "../Common/ring_buffer_helper.h" +#include struct d3d12_data_heap : public data_heap { diff --git a/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.cpp b/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.cpp index fdb6e003ae..2ba3d0e5ec 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.cpp @@ -1,14 +1,16 @@ #include "stdafx.h" #include "stdafx_d3d12.h" #ifdef _MSC_VER +#include "Utilities/Config.h" #include "D3D12PipelineState.h" #include "D3D12GSRender.h" -#include "Emu/state.h" #include "D3D12Formats.h" #include "../rsx_methods.h" #define TO_STRING(x) #x +extern cfg::bool_entry g_cfg_rsx_debug_output; + extern pD3DCompile wrapD3DCompile; void Shader::Compile(const std::string &code, SHADER_TYPE st) @@ -17,7 +19,7 @@ void Shader::Compile(const std::string &code, SHADER_TYPE st) HRESULT hr; ComPtr errorBlob; UINT compileFlags; - if (rpcs3::config.rsx.d3d12.debug_output.value()) + if (g_cfg_rsx_debug_output) compileFlags = D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION; else compileFlags = 0; diff --git a/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.h b/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.h index a84e8ca92a..2fc7de5364 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.h +++ b/rpcs3/Emu/RSX/D3D12/D3D12PipelineState.h @@ -130,7 +130,7 @@ struct D3D12Traits } } - fs::file(fs::get_config_dir() + "FragmentProgram" + std::to_string(ID) + ".hlsl", fom::rewrite).write(shader); + fs::file(fs::get_config_dir() + "FragmentProgram" + std::to_string(ID) + ".hlsl", fs::rewrite).write(shader); fragmentProgramData.id = (u32)ID; } @@ -141,7 +141,7 @@ struct D3D12Traits std::string shaderCode = VS.Decompile(); vertexProgramData.Compile(shaderCode, Shader::SHADER_TYPE::SHADER_TYPE_VERTEX); vertexProgramData.vertex_shader_input_count = RSXVP.rsx_vertex_inputs.size(); - fs::file(fs::get_config_dir() + "VertexProgram" + std::to_string(ID) + ".hlsl", fom::rewrite).write(shaderCode); + fs::file(fs::get_config_dir() + "VertexProgram" + std::to_string(ID) + ".hlsl", fs::rewrite).write(shaderCode); vertexProgramData.id = (u32)ID; } @@ -154,12 +154,12 @@ struct D3D12Traits D3D12_GRAPHICS_PIPELINE_STATE_DESC graphicPipelineStateDesc = {}; if (vertexProgramData.bytecode == nullptr) - throw new EXCEPTION("Vertex program compilation failure"); + throw EXCEPTION("Vertex program compilation failure"); graphicPipelineStateDesc.VS.BytecodeLength = vertexProgramData.bytecode->GetBufferSize(); graphicPipelineStateDesc.VS.pShaderBytecode = vertexProgramData.bytecode->GetBufferPointer(); if (fragmentProgramData.bytecode == nullptr) - throw new EXCEPTION("fragment program compilation failure"); + throw EXCEPTION("fragment program compilation failure"); graphicPipelineStateDesc.PS.BytecodeLength = fragmentProgramData.bytecode->GetBufferSize(); graphicPipelineStateDesc.PS.pShaderBytecode = fragmentProgramData.bytecode->GetBufferPointer(); diff --git a/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp b/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp index f10cbb9bbe..1370d91f30 100644 --- a/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp +++ b/rpcs3/Emu/RSX/D3D12/D3D12RenderTargetSets.cpp @@ -1,11 +1,10 @@ #include "stdafx.h" #include "stdafx_d3d12.h" #ifdef _MSC_VER +#include "Utilities/Config.h" #include "D3D12RenderTargetSets.h" -#include "Utilities/rPlatform.h" // only for rImage #include "Emu/Memory/Memory.h" #include "Emu/System.h" -#include "Emu/state.h" #include "Emu/RSX/GSRender.h" #include "../rsx_methods.h" @@ -13,6 +12,10 @@ #include "D3D12GSRender.h" #include "D3D12Formats.h" +extern cfg::bool_entry g_cfg_rsx_debug_output; +extern cfg::bool_entry g_cfg_rsx_write_color_buffers; +extern cfg::bool_entry g_cfg_rsx_write_depth_buffer; + namespace { u32 get_max_depth_value(rsx::surface_depth_format format) @@ -159,7 +162,7 @@ void D3D12GSRender::clear_surface(u32 arg) m_timers.draw_calls_duration += std::chrono::duration_cast(end_duration - start_duration).count(); m_timers.draw_calls_count++; - if (rpcs3::config.rsx.d3d12.debug_output.value()) + if (g_cfg_rsx_debug_output) { CHECK_HRESULT(get_current_resource_storage().command_list->Close()); m_command_queue->ExecuteCommandLists(1, (ID3D12CommandList**)get_current_resource_storage().command_list.GetAddressOf()); @@ -330,7 +333,7 @@ void D3D12GSRender::copy_render_target_to_dma_location() bool need_transfer = false; - if (m_context_dma_z && rpcs3::state.config.rsx.opengl.write_depth_buffer) + if (m_context_dma_z && g_cfg_rsx_write_depth_buffer) { get_current_resource_storage().command_list->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(std::get<1>(m_rtts.m_bound_depth_stencil), D3D12_RESOURCE_STATE_DEPTH_WRITE, D3D12_RESOURCE_STATE_COPY_SOURCE)); get_current_resource_storage().command_list->CopyTextureRegion(&CD3DX12_TEXTURE_COPY_LOCATION(m_readback_resources.get_heap(), { depth_buffer_offset_in_heap,{ DXGI_FORMAT_R32_TYPELESS, (UINT)clip_w, (UINT)clip_h, 1, (UINT)depth_row_pitch } }), 0, 0, 0, @@ -342,7 +345,7 @@ void D3D12GSRender::copy_render_target_to_dma_location() } size_t color_buffer_offset_in_heap[4]; - if (rpcs3::state.config.rsx.opengl.write_color_buffers) + if (g_cfg_rsx_write_color_buffers) { for (u8 i : get_rtt_indexes(rsx::to_surface_target(rsx::method_registers[NV4097_SET_SURFACE_COLOR_TARGET]))) { @@ -363,7 +366,7 @@ void D3D12GSRender::copy_render_target_to_dma_location() //Wait for result wait_for_command_queue(m_device.Get(), m_command_queue.Get()); - if (address_z && rpcs3::state.config.rsx.opengl.write_depth_buffer) + if (address_z && g_cfg_rsx_write_depth_buffer) { auto ptr = vm::base(address_z); char *depth_buffer = (char*)ptr; @@ -383,7 +386,7 @@ void D3D12GSRender::copy_render_target_to_dma_location() m_readback_resources.unmap(); } - if (rpcs3::state.config.rsx.opengl.write_color_buffers) + if (g_cfg_rsx_write_color_buffers) { size_t srcPitch = get_aligned_pitch(m_surface.color_format, clip_w); size_t dstPitch = get_packed_pitch(m_surface.color_format, clip_w); diff --git a/rpcs3/Emu/RSX/GCM.cpp b/rpcs3/Emu/RSX/GCM.cpp index 645ecd9106..2910594db2 100644 --- a/rpcs3/Emu/RSX/GCM.cpp +++ b/rpcs3/Emu/RSX/GCM.cpp @@ -731,7 +731,7 @@ rsx::vertex_base_type rsx::to_vertex_base_type(u8 in) case 6: return rsx::vertex_base_type::cmp; case 7: return rsx::vertex_base_type::ub256; } - throw new EXCEPTION("Unknow vertex base type %d", in); + throw EXCEPTION("Unknow vertex base type %d", in); } rsx::index_array_type rsx::to_index_array_type(u8 in) @@ -741,7 +741,7 @@ rsx::index_array_type rsx::to_index_array_type(u8 in) case 0: return rsx::index_array_type::u32; case 1: return rsx::index_array_type::u16; } - throw new EXCEPTION("Unknown index array type %d", in); + throw EXCEPTION("Unknown index array type %d", in); } rsx::primitive_type rsx::to_primitive_type(u8 in) @@ -759,7 +759,7 @@ rsx::primitive_type rsx::to_primitive_type(u8 in) case 9: return rsx::primitive_type::quad_strip; case 10: return rsx::primitive_type::polygon; } - throw new EXCEPTION("Unknow primitive type %d", in); + throw EXCEPTION("Unknow primitive type %d", in); } enum diff --git a/rpcs3/Emu/RSX/GL/GLCommonDecompiler.h b/rpcs3/Emu/RSX/GL/GLCommonDecompiler.h index 6d4c11473a..e2a11f6cb6 100644 --- a/rpcs3/Emu/RSX/GL/GLCommonDecompiler.h +++ b/rpcs3/Emu/RSX/GL/GLCommonDecompiler.h @@ -1,7 +1,9 @@ #pragma once + #include "../Common/ShaderParam.h" +#include std::string getFloatTypeNameImpl(size_t elementCount); std::string getFunctionImpl(FUNCTION f); std::string compareFunctionImpl(COMPARE f, const std::string &Op0, const std::string &Op1); -void insert_glsl_legacy_function(std::ostream& OS); \ No newline at end of file +void insert_glsl_legacy_function(std::ostream& OS); diff --git a/rpcs3/Emu/RSX/GL/GLGSRender.cpp b/rpcs3/Emu/RSX/GL/GLGSRender.cpp index d728628d79..1bd3f7c505 100644 --- a/rpcs3/Emu/RSX/GL/GLGSRender.cpp +++ b/rpcs3/Emu/RSX/GL/GLGSRender.cpp @@ -1,12 +1,13 @@ #include "stdafx.h" -#include "Utilities/rPlatform.h" // only for rImage +#include "Utilities/Config.h" #include "Emu/Memory/Memory.h" #include "Emu/System.h" -#include "Emu/state.h" #include "GLGSRender.h" #include "../rsx_methods.h" #include "../Common/BufferUtils.h" +extern cfg::bool_entry g_cfg_rsx_debug_output; + #define DUMP_VERTEX_DATA 0 namespace @@ -366,7 +367,7 @@ void GLGSRender::on_init_thread() GSRender::on_init_thread(); gl::init(); - if (rpcs3::config.rsx.d3d12.debug_output.value()) + if (g_cfg_rsx_debug_output) gl::enable_debugging(); LOG_NOTICE(RSX, "%s", (const char*)glGetString(GL_VERSION)); LOG_NOTICE(RSX, "%s", (const char*)glGetString(GL_SHADING_LANGUAGE_VERSION)); @@ -737,4 +738,4 @@ bool GLGSRender::on_access_violation(u32 address, bool is_writing) { if (is_writing) return m_gl_texture_cache.mark_as_dirty(address); return false; -} \ No newline at end of file +} diff --git a/rpcs3/Emu/RSX/GL/GLProgramBuffer.h b/rpcs3/Emu/RSX/GL/GLProgramBuffer.h index ccecef2037..284bc70218 100644 --- a/rpcs3/Emu/RSX/GL/GLProgramBuffer.h +++ b/rpcs3/Emu/RSX/GL/GLProgramBuffer.h @@ -17,7 +17,7 @@ struct GLTraits fragmentProgramData.Compile(); //checkForGlError("m_fragment_prog.Compile"); - fs::file(fs::get_config_dir() + "FragmentProgram.txt", fom::rewrite).write(fragmentProgramData.shader); + fs::file(fs::get_config_dir() + "FragmentProgram.txt", fs::rewrite).write(fragmentProgramData.shader); } static @@ -27,7 +27,7 @@ struct GLTraits vertexProgramData.Compile(); //checkForGlError("m_vertex_prog.Compile"); - fs::file(fs::get_config_dir() + "VertexProgram.txt", fom::rewrite).write(vertexProgramData.shader); + fs::file(fs::get_config_dir() + "VertexProgram.txt", fs::rewrite).write(vertexProgramData.shader); } static diff --git a/rpcs3/Emu/RSX/GL/gl_helpers.cpp b/rpcs3/Emu/RSX/GL/gl_helpers.cpp index 862773713e..926ae5a0ae 100644 --- a/rpcs3/Emu/RSX/GL/gl_helpers.cpp +++ b/rpcs3/Emu/RSX/GL/gl_helpers.cpp @@ -20,7 +20,7 @@ namespace gl case rsx::primitive_type::quad_strip: return GL_TRIANGLES; case rsx::primitive_type::polygon: return GL_TRIANGLES; } - throw new EXCEPTION("unknow primitive type"); + throw EXCEPTION("unknow primitive type"); } #ifdef WIN32 diff --git a/rpcs3/Emu/RSX/GL/gl_helpers.h b/rpcs3/Emu/RSX/GL/gl_helpers.h index d4ef6f883c..7ec6d54f49 100644 --- a/rpcs3/Emu/RSX/GL/gl_helpers.h +++ b/rpcs3/Emu/RSX/GL/gl_helpers.h @@ -7,9 +7,6 @@ #include #include -#include -#include - #include "OpenGL.h" #include "../GCM.h" @@ -1778,23 +1775,6 @@ namespace gl void operator = (const color4i& rhs) const { m_program.use(); glUniform4i(location(), rhs.r, rhs.g, rhs.b, rhs.a); } void operator = (const color4f& rhs) const { m_program.use(); glUniform4f(location(), rhs.r, rhs.g, rhs.b, rhs.a); } //void operator = (const color4d& rhs) const { m_program.use(); glUniform4d(location(), rhs.r, rhs.g, rhs.b, rhs.a); } - - void operator = (const glm::ivec2& rhs) const { m_program.use(); glUniform2i(location(), rhs.r, rhs.g); } - void operator = (const glm::vec2& rhs) const { m_program.use(); glUniform2f(location(), rhs.r, rhs.g); } - //void operator = (const glm::dvec2& rhs) const { m_program.use(); glUniform2d(location(), rhs.r, rhs.g); } - void operator = (const glm::ivec3& rhs) const { m_program.use(); glUniform3i(location(), rhs.r, rhs.g, rhs.b); } - void operator = (const glm::vec3& rhs) const { m_program.use(); glUniform3f(location(), rhs.r, rhs.g, rhs.b); } - //void operator = (const glm::dvec3& rhs) const { m_program.use(); glUniform3d(location(), rhs.r, rhs.g, rhs.b); } - void operator = (const glm::ivec4& rhs) const { m_program.use(); glUniform4i(location(), rhs.r, rhs.g, rhs.b, rhs.a); } - void operator = (const glm::vec4& rhs) const { m_program.use(); glUniform4f(location(), rhs.r, rhs.g, rhs.b, rhs.a); } - //void operator = (const glm::dvec4& rhs) const { m_program.use(); glUniform4d(location(), rhs.r, rhs.g, rhs.b, rhs.a); } - - void operator = (const glm::mat2& rhs) const { m_program.use(); glUniformMatrix2fv(location(), 1, GL_FALSE, glm::value_ptr(rhs)); } - //void operator = (const glm::dmat2& rhs) const { m_program.use(); glUniformMatrix2dv(location(), 1, GL_FALSE, glm::value_ptr(rhs)); } - void operator = (const glm::mat3& rhs) const { m_program.use(); glUniformMatrix3fv(location(), 1, GL_FALSE, glm::value_ptr(rhs)); } - //void operator = (const glm::dmat3& rhs) const { m_program.use(); glUniformMatrix3dv(location(), 1, GL_FALSE, glm::value_ptr(rhs)); } - void operator = (const glm::mat4& rhs) const { m_program.use(); glUniformMatrix4fv(location(), 1, GL_FALSE, glm::value_ptr(rhs)); } - //void operator = (const glm::dmat4& rhs) const { m_program.use(); glUniformMatrix4dv(location(), 1, GL_FALSE, glm::value_ptr(rhs)); } }; class attrib_t @@ -1826,13 +1806,6 @@ namespace gl void operator = (const color4f& rhs) const { glDisableVertexAttribArray(location()); glVertexAttrib4f(location(), rhs.r, rhs.g, rhs.b, rhs.a); } void operator = (const color4d& rhs) const { glDisableVertexAttribArray(location()); glVertexAttrib4d(location(), rhs.r, rhs.g, rhs.b, rhs.a); } - void operator = (const glm::vec2& rhs) const { glDisableVertexAttribArray(location()); glVertexAttrib2f(location(), rhs.r, rhs.g); } - void operator = (const glm::dvec2& rhs) const { glDisableVertexAttribArray(location()); glVertexAttrib2d(location(), rhs.r, rhs.g); } - void operator = (const glm::vec3& rhs) const { glDisableVertexAttribArray(location()); glVertexAttrib3f(location(), rhs.r, rhs.g, rhs.b); } - void operator = (const glm::dvec3& rhs) const { glDisableVertexAttribArray(location()); glVertexAttrib3d(location(), rhs.r, rhs.g, rhs.b); } - void operator = (const glm::vec4& rhs) const { glDisableVertexAttribArray(location()); glVertexAttrib4f(location(), rhs.r, rhs.g, rhs.b, rhs.a); } - void operator = (const glm::dvec4& rhs) const { glDisableVertexAttribArray(location()); glVertexAttrib4d(location(), rhs.r, rhs.g, rhs.b, rhs.a); } - void operator =(buffer_pointer& pointer) const { pointer.get_vao().enable_for_attribute(location()); diff --git a/rpcs3/Emu/RSX/GL/gl_render_targets.cpp b/rpcs3/Emu/RSX/GL/gl_render_targets.cpp index 0aef73fc28..8a61bed026 100644 --- a/rpcs3/Emu/RSX/GL/gl_render_targets.cpp +++ b/rpcs3/Emu/RSX/GL/gl_render_targets.cpp @@ -1,7 +1,12 @@ #include "stdafx.h" +#include "Utilities/Config.h" #include "../rsx_methods.h" #include "GLGSRender.h" -#include "Emu/state.h" + +extern cfg::bool_entry g_cfg_rsx_write_color_buffers; +extern cfg::bool_entry g_cfg_rsx_write_depth_buffer; +extern cfg::bool_entry g_cfg_rsx_read_color_buffers; +extern cfg::bool_entry g_cfg_rsx_read_depth_buffer; color_format rsx::internals::surface_color_format_to_gl(rsx::surface_color_format color_format) { @@ -151,7 +156,7 @@ void GLGSRender::read_buffers() glDisable(GL_STENCIL_TEST); - if (rpcs3::state.config.rsx.opengl.read_color_buffers) + if (g_cfg_rsx_read_color_buffers) { auto color_format = rsx::internals::surface_color_format_to_gl(m_surface.color_format); @@ -222,7 +227,7 @@ void GLGSRender::read_buffers() } } - if (rpcs3::state.config.rsx.opengl.read_depth_buffer) + if (g_cfg_rsx_read_depth_buffer) { //TODO: use pitch u32 pitch = rsx::method_registers[NV4097_SET_SURFACE_PITCH_Z]; @@ -279,7 +284,7 @@ void GLGSRender::write_buffers() //TODO: Detect when the data is actually being used by cell and issue download command on-demand (mark as not present?) //Should also mark cached resources as dirty so that read buffers works out-of-the-box without modification - if (rpcs3::state.config.rsx.opengl.write_color_buffers) + if (g_cfg_rsx_write_color_buffers) { auto color_format = rsx::internals::surface_color_format_to_gl(m_surface.color_format); @@ -337,7 +342,7 @@ void GLGSRender::write_buffers() } } - if (rpcs3::state.config.rsx.opengl.write_depth_buffer) + if (g_cfg_rsx_write_depth_buffer) { //TODO: use pitch u32 pitch = rsx::method_registers[NV4097_SET_SURFACE_PITCH_Z]; diff --git a/rpcs3/Emu/RSX/GSManager.cpp b/rpcs3/Emu/RSX/GSManager.cpp deleted file mode 100644 index 6bb058a596..0000000000 --- a/rpcs3/Emu/RSX/GSManager.cpp +++ /dev/null @@ -1,44 +0,0 @@ -#include "stdafx.h" -#include "Emu/System.h" -#include "Emu/Memory/Memory.h" -#include "Emu/SysCalls/Modules/cellVideoOut.h" -#include "Emu/state.h" - -#include "GSManager.h" - -void GSInfo::Init() -{ - mode.resolutionId = (u8)rpcs3::state.config.rsx.resolution.value(); - mode.scanMode = CELL_VIDEO_OUT_SCAN_MODE_INTERLACE; - mode.conversion = CELL_VIDEO_OUT_DISPLAY_CONVERSION_NONE; - mode.aspect = (u8)rpcs3::state.config.rsx.aspect_ratio.value(); - mode.refreshRates = CELL_VIDEO_OUT_REFRESH_RATE_50HZ; - mode.format = CELL_VIDEO_OUT_BUFFER_COLOR_FORMAT_X8R8G8B8; - mode.pitch = 4; -} - -void GSManager::Init() -{ - if (m_render) return; - - m_info.Init(); - - m_render = Emu.GetCallbacks().get_gs_render(); - - //m_render->Init(GetInfo().outresolution.width, GetInfo().outresolution.height); -} - -void GSManager::Close() -{ - m_render.reset(); -} - -u8 GSManager::GetState() -{ - return CELL_VIDEO_OUT_OUTPUT_STATE_ENABLED; -} - -u8 GSManager::GetColorSpace() -{ - return CELL_VIDEO_OUT_COLOR_SPACE_RGB; -} diff --git a/rpcs3/Emu/RSX/GSManager.h b/rpcs3/Emu/RSX/GSManager.h deleted file mode 100644 index 91f9ae888b..0000000000 --- a/rpcs3/Emu/RSX/GSManager.h +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once - -class GSRender; - -struct GSInfo -{ - struct - { - u8 resolutionId; - u8 scanMode; - u8 conversion; - u8 aspect; - u8 format; - u16 refreshRates; - u32 pitch; - } mode; - - GSInfo() - { - } - - void Init(); -}; - -class GSManager -{ - GSInfo m_info; - std::shared_ptr m_render; - -public: - void Init(); - void Close(); - - bool IsInited() const { return m_render != nullptr; } - - GSInfo& GetInfo() { return m_info; } - GSRender& GetRender() { return *m_render; } - - u8 GetState(); - u8 GetColorSpace(); -}; diff --git a/rpcs3/Emu/RSX/GSRender.cpp b/rpcs3/Emu/RSX/GSRender.cpp index d7358fc642..f02f51d680 100644 --- a/rpcs3/Emu/RSX/GSRender.cpp +++ b/rpcs3/Emu/RSX/GSRender.cpp @@ -1,10 +1,13 @@ #include "stdafx.h" +#include "Utilities/Config.h" #include "Emu/Memory/Memory.h" #include "Emu/System.h" -#include "GSManager.h" #include "GSRender.h" +// temporarily (u8 value is really CellVideoOutResolutionId, but HLE declarations shouldn't be available for the rest of emu, even indirectly) +extern cfg::map_entry g_cfg_video_out_resolution; +extern const std::unordered_map g_video_out_resolution_map; draw_context_t GSFrameBase::new_context() { @@ -16,12 +19,8 @@ draw_context_t GSFrameBase::new_context() return nullptr; } -void GSFrameBase::title_message(const std::wstring& msg) -{ - m_title_message = msg; -} - -GSRender::GSRender(frame_type type) : m_frame(Emu.GetCallbacks().get_gs_frame(type).release()) +GSRender::GSRender(frame_type type) + : m_frame(Emu.GetCallbacks().get_gs_frame(type, g_video_out_resolution_map.at(g_cfg_video_out_resolution.get())).release()) { } @@ -36,7 +35,7 @@ GSRender::~GSRender() } } -void GSRender::on_init() +void GSRender::on_init_rsx() { if (m_frame) { diff --git a/rpcs3/Emu/RSX/GSRender.h b/rpcs3/Emu/RSX/GSRender.h index 2ebffee14a..6743d6391a 100644 --- a/rpcs3/Emu/RSX/GSRender.h +++ b/rpcs3/Emu/RSX/GSRender.h @@ -1,14 +1,29 @@ #pragma once + #include "Emu/RSX/RSXThread.h" #include +struct RSXDebuggerProgram +{ + u32 id; + u32 vp_id; + u32 fp_id; + std::string vp_shader; + std::string fp_shader; + bool modified; + + RSXDebuggerProgram() + : modified(false) + { + } +}; + +using RSXDebuggerPrograms = std::vector; + using draw_context_t = std::shared_ptr; class GSFrameBase { -protected: - std::wstring m_title_message; - public: GSFrameBase() = default; GSFrameBase(const GSFrameBase&) = delete; @@ -25,7 +40,6 @@ public: virtual size2i client_size() = 0; virtual void* handle() const = 0; - void title_message(const std::wstring&); protected: virtual void delete_context(void* ctx) = 0; @@ -50,7 +64,7 @@ public: GSRender(frame_type type); virtual ~GSRender(); - void on_init() override; + void on_init_rsx() override; void on_init_thread() override; void flip(int buffer) override; diff --git a/rpcs3/Emu/RSX/RSXThread.cpp b/rpcs3/Emu/RSX/RSXThread.cpp index f3e28cf1a2..6878d06b60 100644 --- a/rpcs3/Emu/RSX/RSXThread.cpp +++ b/rpcs3/Emu/RSX/RSXThread.cpp @@ -1,22 +1,31 @@ #include "stdafx.h" +#include "Utilities/Config.h" #include "Emu/Memory/Memory.h" #include "Emu/System.h" -#include "Emu/state.h" -#include "Emu/RSX/GSManager.h" #include "RSXThread.h" -#include "Emu/SysCalls/Callback.h" -#include "Emu/SysCalls/CB_FUNC.h" -#include "Emu/SysCalls/lv2/sys_time.h" +#include "Emu/Cell/PPUCallback.h" #include "Common/BufferUtils.h" #include "rsx_methods.h" #define CMD_DEBUG 0 +cfg::bool_entry g_cfg_rsx_write_color_buffers(cfg::root.video, "Write Color Buffers"); +cfg::bool_entry g_cfg_rsx_write_depth_buffer(cfg::root.video, "Write Depth Buffer"); +cfg::bool_entry g_cfg_rsx_read_color_buffers(cfg::root.video, "Read Color Buffers"); +cfg::bool_entry g_cfg_rsx_read_depth_buffer(cfg::root.video, "Read Depth Buffer"); +cfg::bool_entry g_cfg_rsx_log_programs(cfg::root.video, "Log shader programs"); +cfg::bool_entry g_cfg_rsx_vsync(cfg::root.video, "VSync"); +cfg::bool_entry g_cfg_rsx_3dtv(cfg::root.video, "3D Monitor"); +cfg::bool_entry g_cfg_rsx_debug_output(cfg::root.video, "Debug output"); +cfg::bool_entry g_cfg_rsx_overlay(cfg::root.video, "Debug overlay"); + bool user_asked_for_frame_capture = false; frame_capture_data frame_debug; +namespace vm { using namespace ps3; } + namespace rsx { std::function g_access_violation_handler; @@ -28,14 +37,14 @@ namespace rsx void shaders_cache::load(const std::string &path, shader_language lang) { - std::string lang_name = convert::to(lang); + const std::string lang_name = bijective_find(lang, ""); auto extract_hash = [](const std::string &string) { return std::stoull(string.substr(0, string.find('.')).c_str(), 0, 16); }; - for (const fs::dir::entry &entry : fs::dir{ path }) + for (const auto& entry : fs::dir(path)) { if (entry.name == "." || entry.name == "..") continue; @@ -106,7 +115,7 @@ namespace rsx throw EXCEPTION("GetAddress(offset=0x%x, location=0x%x): RSXIO memory not mapped", offset, location); } - //if (Emu.GetGSManager().GetRender().strict_ordering[offset >> 20]) + //if (fxm::get()->strict_ordering[offset >> 20]) //{ // _mm_mfence(); // probably doesn't have any effect on current implementation //} @@ -353,7 +362,7 @@ namespace rsx last_flip_time = get_system_time() - 1000000; - scope_thread_t vblank(PURE_EXPR("VBlank Thread"s), [this]() + scope_thread vblank("VBlank Thread", [this]() { const u64 start_time = get_system_time(); @@ -386,8 +395,8 @@ namespace rsx { CHECK_EMU_STATUS; - be_t get = ctrl->get; - be_t put = ctrl->put; + const u32 get = ctrl->get; + const u32 put = ctrl->put; if (put == get || !Emu.IsRunning()) { @@ -442,10 +451,7 @@ namespace rsx u32 reg = cmd & CELL_GCM_METHOD_FLAG_NON_INCREMENT ? first_cmd : first_cmd + i; u32 value = args[i]; - if (rpcs3::config.misc.log.rsx_logging.value()) - { - LOG_NOTICE(RSX, "%s(0x%x) = 0x%x", get_method_name(reg).c_str(), reg, value); - } + LOG_TRACE(RSX, "%s(0x%x) = 0x%x", get_method_name(reg).c_str(), reg, value); method_registers[reg] = value; if (capture_current_frame) @@ -831,7 +837,7 @@ namespace rsx m_used_gcm_commands.clear(); - on_init(); + on_init_rsx(); start(); } diff --git a/rpcs3/Emu/RSX/RSXThread.h b/rpcs3/Emu/RSX/RSXThread.h index 1277cc8341..d449f4c4a5 100644 --- a/rpcs3/Emu/RSX/RSXThread.h +++ b/rpcs3/Emu/RSX/RSXThread.h @@ -1,15 +1,17 @@ #pragma once +#include +#include +#include +#include #include "GCM.h" #include "RSXTexture.h" #include "RSXVertexProgram.h" #include "RSXFragmentProgram.h" -#include #include "Utilities/Semaphore.h" #include "Utilities/Thread.h" #include "Utilities/Timer.h" -#include "Utilities/convert.h" extern u64 get_system_time(); @@ -46,44 +48,20 @@ namespace rsx enum class shader_language { glsl, - hlsl + hlsl, }; } -namespace convert +template<> +struct bijective { - template<> - struct to_impl_t + static constexpr std::pair map[] { - static rsx::shader_language func(const std::string &from) - { - if (from == "glsl") - return rsx::shader_language::glsl; - - if (from == "hlsl") - return rsx::shader_language::hlsl; - - throw; - } + { rsx::shader_language::glsl, "glsl" }, + { rsx::shader_language::hlsl, "hlsl" }, }; +}; - template<> - struct to_impl_t - { - static std::string func(rsx::shader_language from) - { - switch (from) - { - case rsx::shader_language::glsl: - return "glsl"; - case rsx::shader_language::hlsl: - return "hlsl"; - } - - throw; - } - }; -} namespace rsx { namespace limits @@ -212,7 +190,7 @@ namespace rsx indexed, }; - class thread : public named_thread_t + class thread : public named_thread { protected: std::stack m_call_stack; @@ -280,7 +258,6 @@ namespace rsx u32 gcm_buffers_count; u32 gcm_current_buffer; u32 ctxt_addr; - u32 report_main_addr; u32 label_addr; rsx::draw_command draw_command; primitive_type draw_mode; @@ -324,10 +301,13 @@ namespace rsx public: virtual std::string get_name() const override; + virtual void on_init() override {} // disable start() (TODO) + virtual void on_stop() override {} // disable join() + virtual void begin(); virtual void end(); - virtual void on_init() = 0; + virtual void on_init_rsx() = 0; virtual void on_init_thread() = 0; virtual bool do_method(u32 cmd, u32 value) { return false; } virtual void flip(int buffer) = 0; diff --git a/rpcs3/Emu/RSX/VK/VKCommonDecompiler.h b/rpcs3/Emu/RSX/VK/VKCommonDecompiler.h index b5b72f70b6..0ca2d3158c 100644 --- a/rpcs3/Emu/RSX/VK/VKCommonDecompiler.h +++ b/rpcs3/Emu/RSX/VK/VKCommonDecompiler.h @@ -17,4 +17,4 @@ namespace vk const varying_register_t& get_varying_register(const std::string& name); bool compile_glsl_to_spv(std::string& shader, glsl::program_domain domain, std::vector &spv); -} \ No newline at end of file +} diff --git a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp index c2951f181e..7beb37484a 100644 --- a/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKFragmentProgram.cpp @@ -276,7 +276,7 @@ void VKFragmentProgram::Decompile(const RSXFragmentProgram& prog) void VKFragmentProgram::Compile() { - fs::file(fs::get_config_dir() + "FragmentProgram.frag", fom::rewrite).write(shader); + fs::file(fs::get_config_dir() + "FragmentProgram.frag", fs::rewrite).write(shader); std::vector spir_v; if (!vk::compile_glsl_to_spv(shader, vk::glsl::glsl_fragment_program, spir_v)) diff --git a/rpcs3/Emu/RSX/VK/VKGSRender.cpp b/rpcs3/Emu/RSX/VK/VKGSRender.cpp index b3be3b0497..dfdf299ec5 100644 --- a/rpcs3/Emu/RSX/VK/VKGSRender.cpp +++ b/rpcs3/Emu/RSX/VK/VKGSRender.cpp @@ -1,8 +1,6 @@ #include "stdafx.h" -#include "Utilities/rPlatform.h" // only for rImage #include "Emu/Memory/Memory.h" #include "Emu/System.h" -#include "Emu/state.h" #include "VKGSRender.h" #include "../rsx_methods.h" #include "../Common/BufferUtils.h" diff --git a/rpcs3/Emu/RSX/VK/VKHelpers.cpp b/rpcs3/Emu/RSX/VK/VKHelpers.cpp index 0b14fd1518..17e5b4a185 100644 --- a/rpcs3/Emu/RSX/VK/VKHelpers.cpp +++ b/rpcs3/Emu/RSX/VK/VKHelpers.cpp @@ -251,4 +251,4 @@ namespace vk return false; } -} \ No newline at end of file +} diff --git a/rpcs3/Emu/RSX/VK/VKHelpers.h b/rpcs3/Emu/RSX/VK/VKHelpers.h index 53106de926..3a64404897 100644 --- a/rpcs3/Emu/RSX/VK/VKHelpers.h +++ b/rpcs3/Emu/RSX/VK/VKHelpers.h @@ -8,15 +8,14 @@ #include #include -#include -#include - -#include "Emu/state.h" +#include "Utilities/Config.h" #include "VulkanAPI.h" #include "../GCM.h" #include "../Common/TextureUtils.h" #include "../Common/ring_buffer_helper.h" +extern cfg::bool_entry g_cfg_rsx_debug_output; + namespace rsx { class texture; @@ -174,7 +173,7 @@ namespace vk std::vector layers; - if (rpcs3::config.rsx.d3d12.debug_output.value()) + if (g_cfg_rsx_debug_output) layers.push_back("VK_LAYER_LUNARG_standard_validation"); VkDeviceCreateInfo device; @@ -1039,7 +1038,7 @@ namespace vk std::vector layers; - if (rpcs3::config.rsx.d3d12.debug_output.value()) + if (g_cfg_rsx_debug_output) layers.push_back("VK_LAYER_LUNARG_standard_validation"); VkInstanceCreateInfo instance_info = {}; diff --git a/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp b/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp index 6adff8ac03..0713ea9cc8 100644 --- a/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp +++ b/rpcs3/Emu/RSX/VK/VKVertexBuffers.cpp @@ -1,8 +1,6 @@ #include "stdafx.h" -#include "Utilities/rPlatform.h" // only for rImage #include "Emu/Memory/Memory.h" #include "Emu/System.h" -#include "Emu/state.h" #include "VKGSRender.h" #include "../rsx_methods.h" #include "../Common/BufferUtils.h" @@ -590,4 +588,5 @@ VKGSRender::upload_vertex_data() } return std::make_tuple(prims, is_indexed_draw, index_count, offset_in_index_buffer, index_format); -} \ No newline at end of file +} + diff --git a/rpcs3/Emu/RSX/VK/VKVertexProgram.cpp b/rpcs3/Emu/RSX/VK/VKVertexProgram.cpp index 4841597d93..b463e6d098 100644 --- a/rpcs3/Emu/RSX/VK/VKVertexProgram.cpp +++ b/rpcs3/Emu/RSX/VK/VKVertexProgram.cpp @@ -253,7 +253,7 @@ void VKVertexProgram::Decompile(const RSXVertexProgram& prog) void VKVertexProgram::Compile() { - fs::file(fs::get_config_dir() + "VertexProgram.vert", fom::rewrite).write(shader); + fs::file(fs::get_config_dir() + "VertexProgram.vert", fs::rewrite).write(shader); std::vector spir_v; if (!vk::compile_glsl_to_spv(shader, vk::glsl::glsl_vertex_program, spir_v)) diff --git a/rpcs3/Emu/RSX/VK/VulkanAPI.cpp b/rpcs3/Emu/RSX/VK/VulkanAPI.cpp index 1577c4e3bc..fd4f341c7b 100644 --- a/rpcs3/Emu/RSX/VK/VulkanAPI.cpp +++ b/rpcs3/Emu/RSX/VK/VulkanAPI.cpp @@ -1 +1 @@ -#include "stdafx.h" \ No newline at end of file +#include "stdafx.h" diff --git a/rpcs3/Emu/RSX/rsx_methods.cpp b/rpcs3/Emu/RSX/rsx_methods.cpp index b86f15c71b..8193f66324 100644 --- a/rpcs3/Emu/RSX/rsx_methods.cpp +++ b/rpcs3/Emu/RSX/rsx_methods.cpp @@ -1,12 +1,21 @@ #include "stdafx.h" +#include "Utilities/Config.h" #include "rsx_methods.h" #include "RSXThread.h" #include "Emu/Memory/Memory.h" #include "Emu/System.h" -#include "Emu/state.h" #include "rsx_utils.h" -#include "Emu/SysCalls/Callback.h" -#include "Emu/SysCalls/CB_FUNC.h" +#include "Emu/Cell/PPUCallback.h" + +cfg::map_entry g_cfg_rsx_frame_limit(cfg::root.video, "Frame limit", +{ + { "Off", 0. }, + { "59.94", 59.94 }, + { "50", 50. }, + { "60", 60. }, + { "30", 30. }, + { "Auto", -1. }, +}); namespace rsx { @@ -667,24 +676,14 @@ namespace rsx rsx->sem_flip.post_and_wait(); - //sync - double limit; - switch (rpcs3::state.config.rsx.frame_limit.value()) + if (double limit = g_cfg_rsx_frame_limit.get()) { - case rsx_frame_limit::_50: limit = 50.; break; - case rsx_frame_limit::_59_94: limit = 59.94; break; - case rsx_frame_limit::_30: limit = 30.; break; - case rsx_frame_limit::_60: limit = 60.; break; - case rsx_frame_limit::Auto: limit = rsx->fps_limit; break; //TODO + if (limit < 0) limit = rsx->fps_limit; // TODO - case rsx_frame_limit::Off: - default: - return; + std::this_thread::sleep_for(std::chrono::milliseconds((s64)(1000.0 / limit - rsx->timer_sync.GetElapsedTimeInMilliSec()))); + rsx->timer_sync.Start(); + rsx->local_transform_constants.clear(); } - - std::this_thread::sleep_for(std::chrono::milliseconds((s64)(1000.0 / limit - rsx->timer_sync.GetElapsedTimeInMilliSec()))); - rsx->timer_sync.Start(); - rsx->local_transform_constants.clear(); } void user_command(thread* rsx, u32 arg)