From bfc8ecbeaa1ec1ee4fb69de8bf0277462298cbd4 Mon Sep 17 00:00:00 2001 From: "Dr. Chat" Date: Tue, 26 Dec 2017 20:57:28 -0600 Subject: [PATCH 1/4] [XMA] Check for invalid packet number in ValidFrameOffset --- src/xenia/apu/xma_context.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/xenia/apu/xma_context.cc b/src/xenia/apu/xma_context.cc index f20aa4361..2fd40a928 100644 --- a/src/xenia/apu/xma_context.cc +++ b/src/xenia/apu/xma_context.cc @@ -225,6 +225,11 @@ bool XmaContext::ValidFrameOffset(uint8_t* block, size_t size_bytes, size_t frame_offset_bits) { uint32_t packet_num = GetFramePacketNumber(block, size_bytes, frame_offset_bits); + if (packet_num == -1) { + // Invalid packet number + return false; + } + uint8_t* packet = block + (packet_num * kBytesPerPacket); size_t relative_offset_bits = frame_offset_bits % (kBytesPerPacket * 8); From 26f3100c23e3547d972179138b633e9a1c63d5c2 Mon Sep 17 00:00:00 2001 From: DrChat Date: Sun, 24 Dec 2017 13:54:44 -0600 Subject: [PATCH 2/4] [SPIR-V] Don't normalize denormalized 10/11/11 formats if not requested --- src/xenia/gpu/spirv_shader_translator.cc | 50 +++++++++++++++--------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/src/xenia/gpu/spirv_shader_translator.cc b/src/xenia/gpu/spirv_shader_translator.cc index 7ec5b9535..efdcf924e 100644 --- a/src/xenia/gpu/spirv_shader_translator.cc +++ b/src/xenia/gpu/spirv_shader_translator.cc @@ -716,14 +716,6 @@ void SpirvShaderTranslator::PreProcessControlFlowInstructions( } else if (instr.opcode() == ucode::ControlFlowOpcode::kLoopStart) { uint32_t address = instr.loop_start.address(); - // Label the loop skip address. - if (!cf_blocks_[address].labelled) { - cf_blocks_[address].labelled = true; - operands.push_back(address); - operands.push_back(cf_blocks_[address].block->getId()); - cf_blocks_[address].block->addPredecessor(loop_body_block_); - } - // Label the body if (!cf_blocks_[i + 1].labelled) { cf_blocks_[i + 1].labelled = true; @@ -731,6 +723,14 @@ void SpirvShaderTranslator::PreProcessControlFlowInstructions( operands.push_back(cf_blocks_[i + 1].block->getId()); cf_blocks_[i + 1].block->addPredecessor(loop_body_block_); } + + // Label the loop skip address. + if (!cf_blocks_[address].labelled) { + cf_blocks_[address].labelled = true; + operands.push_back(address); + operands.push_back(cf_blocks_[address].block->getId()); + cf_blocks_[address].block->addPredecessor(loop_body_block_); + } } else if (instr.opcode() == ucode::ControlFlowOpcode::kLoopEnd) { uint32_t address = instr.loop_end.address(); @@ -1231,11 +1231,6 @@ void SpirvShaderTranslator::ProcessVertexFetchInstruction( GetVertexFormatComponentCount(instr.attributes.data_format); // Skip loading if it's an indexed fetch. - auto vertex_ptr = vertex_binding_map_[instr.operands[1].storage_index] - [instr.attributes.offset]; - assert_not_zero(vertex_ptr); - auto vertex = b.createLoad(vertex_ptr); - auto cond = b.createBinOp(spv::Op::OpIEqual, bool_type_, vertex_idx, shader_vertex_idx); Id alt_vertex = 0; @@ -1268,6 +1263,7 @@ void SpirvShaderTranslator::ProcessVertexFetchInstruction( assert_unhandled_case(vertex_components); } + spv::Id vertex = 0; switch (instr.attributes.data_format) { case VertexFormat::k_8_8_8_8: case VertexFormat::k_2_10_10_10: @@ -1283,11 +1279,16 @@ void SpirvShaderTranslator::ProcessVertexFetchInstruction( case VertexFormat::k_32_32_32_FLOAT: case VertexFormat::k_32_32_32_32_FLOAT: // These are handled, for now. + auto vertex_ptr = vertex_binding_map_[instr.operands[1].storage_index] + [instr.attributes.offset]; + assert_not_zero(vertex_ptr); + vertex = b.createLoad(vertex_ptr); break; case VertexFormat::k_10_11_11: { // This needs to be converted. bool is_signed = instr.attributes.is_signed; + bool is_integer = instr.attributes.is_integer; auto op = is_signed ? spv::Op::OpBitFieldSExtract : spv::Op::OpBitFieldUExtract; auto comp_type = is_signed ? int_type_ : uint_type_; @@ -1315,9 +1316,14 @@ void SpirvShaderTranslator::ProcessVertexFetchInstruction( components[i] = b.createUnaryOp(op, float_type_, components[i]); } - components[0] = ConvertNormVar(components[0], float_type_, 11, is_signed); - components[1] = ConvertNormVar(components[1], float_type_, 11, is_signed); - components[2] = ConvertNormVar(components[2], float_type_, 10, is_signed); + if (!is_integer) { + components[0] = + ConvertNormVar(components[0], float_type_, 11, is_signed); + components[1] = + ConvertNormVar(components[1], float_type_, 11, is_signed); + components[2] = + ConvertNormVar(components[2], float_type_, 10, is_signed); + } vertex = b.createCompositeConstruct( vec3_float_type_, @@ -1327,6 +1333,7 @@ void SpirvShaderTranslator::ProcessVertexFetchInstruction( case VertexFormat::k_11_11_10: { // This needs to be converted. bool is_signed = instr.attributes.is_signed; + bool is_integer = instr.attributes.is_integer; auto op = is_signed ? spv::Op::OpBitFieldSExtract : spv::Op::OpBitFieldUExtract; auto comp_type = is_signed ? int_type_ : uint_type_; @@ -1352,9 +1359,14 @@ void SpirvShaderTranslator::ProcessVertexFetchInstruction( components[i] = b.createUnaryOp(op, float_type_, components[i]); } - components[0] = ConvertNormVar(components[0], float_type_, 11, is_signed); - components[1] = ConvertNormVar(components[1], float_type_, 11, is_signed); - components[2] = ConvertNormVar(components[2], float_type_, 10, is_signed); + if (!is_integer) { + components[0] = + ConvertNormVar(components[0], float_type_, 11, is_signed); + components[1] = + ConvertNormVar(components[1], float_type_, 11, is_signed); + components[2] = + ConvertNormVar(components[2], float_type_, 10, is_signed); + } vertex = b.createCompositeConstruct( vec3_float_type_, From c64916be94ebb106f60723f195f335820ca677ae Mon Sep 17 00:00:00 2001 From: DrChat Date: Thu, 28 Dec 2017 16:19:32 -0600 Subject: [PATCH 3/4] Display a dialog if the emulator failed to launch a title specified on the command line. --- src/xenia/app/xenia_main.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xenia/app/xenia_main.cc b/src/xenia/app/xenia_main.cc index ce013ec22..c715e733e 100644 --- a/src/xenia/app/xenia_main.cc +++ b/src/xenia/app/xenia_main.cc @@ -210,7 +210,7 @@ int xenia_main(const std::vector& args) { std::wstring abs_path = xe::to_absolute_path(path); result = emulator->LaunchPath(abs_path); if (XFAILED(result)) { - XELOGE("Failed to launch target: %.8X", result); + xe::FatalError("Failed to launch target: %.8X", result); emulator.reset(); emulator_window.reset(); return 1; From d512d4127fa12a710e5d1d6d8067fe050b3445e7 Mon Sep 17 00:00:00 2001 From: "Dr. Chat" Date: Mon, 1 Jan 2018 15:00:37 -0600 Subject: [PATCH 4/4] [SPIR-V] Fix the build. --- src/xenia/gpu/spirv_shader_translator.cc | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/xenia/gpu/spirv_shader_translator.cc b/src/xenia/gpu/spirv_shader_translator.cc index efdcf924e..f646f8920 100644 --- a/src/xenia/gpu/spirv_shader_translator.cc +++ b/src/xenia/gpu/spirv_shader_translator.cc @@ -1263,7 +1263,10 @@ void SpirvShaderTranslator::ProcessVertexFetchInstruction( assert_unhandled_case(vertex_components); } - spv::Id vertex = 0; + auto vertex_ptr = vertex_binding_map_[instr.operands[1].storage_index] + [instr.attributes.offset]; + assert_not_zero(vertex_ptr); + spv::Id vertex = b.createLoad(vertex_ptr); switch (instr.attributes.data_format) { case VertexFormat::k_8_8_8_8: case VertexFormat::k_2_10_10_10: @@ -1277,13 +1280,9 @@ void SpirvShaderTranslator::ProcessVertexFetchInstruction( case VertexFormat::k_32_FLOAT: case VertexFormat::k_32_32_FLOAT: case VertexFormat::k_32_32_32_FLOAT: - case VertexFormat::k_32_32_32_32_FLOAT: + case VertexFormat::k_32_32_32_32_FLOAT: { // These are handled, for now. - auto vertex_ptr = vertex_binding_map_[instr.operands[1].storage_index] - [instr.attributes.offset]; - assert_not_zero(vertex_ptr); - vertex = b.createLoad(vertex_ptr); - break; + } break; case VertexFormat::k_10_11_11: { // This needs to be converted.