Pica/VertexShader: Support negating src2.

This commit is contained in:
Tony Wasserka 2014-12-12 17:55:43 +01:00
parent cc5746abfe
commit ce36ad454e
2 changed files with 9 additions and 3 deletions

View file

@ -10,10 +10,10 @@
#include <nihstro/shader_bytecode.h> #include <nihstro/shader_bytecode.h>
#include "debug_utils/debug_utils.h"
#include "pica.h" #include "pica.h"
#include "vertex_shader.h" #include "vertex_shader.h"
#include "debug_utils/debug_utils.h"
using nihstro::Instruction; using nihstro::Instruction;
using nihstro::RegisterType; using nihstro::RegisterType;
@ -99,6 +99,7 @@ static void ProcessShaderCode(VertexShaderState& state) {
const SwizzlePattern& swizzle = *(SwizzlePattern*)&swizzle_data[instr.common.operand_desc_id]; const SwizzlePattern& swizzle = *(SwizzlePattern*)&swizzle_data[instr.common.operand_desc_id];
const bool negate_src1 = (swizzle.negate_src1 != 0); const bool negate_src1 = (swizzle.negate_src1 != 0);
const bool negate_src2 = (swizzle.negate_src2 != 0);
float24 src1[4] = { float24 src1[4] = {
src1_[(int)swizzle.GetSelectorSrc1(0)], src1_[(int)swizzle.GetSelectorSrc1(0)],
@ -112,12 +113,18 @@ static void ProcessShaderCode(VertexShaderState& state) {
src1[2] = src1[2] * float24::FromFloat32(-1); src1[2] = src1[2] * float24::FromFloat32(-1);
src1[3] = src1[3] * float24::FromFloat32(-1); src1[3] = src1[3] * float24::FromFloat32(-1);
} }
const float24 src2[4] = { float24 src2[4] = {
src2_[(int)swizzle.GetSelectorSrc2(0)], src2_[(int)swizzle.GetSelectorSrc2(0)],
src2_[(int)swizzle.GetSelectorSrc2(1)], src2_[(int)swizzle.GetSelectorSrc2(1)],
src2_[(int)swizzle.GetSelectorSrc2(2)], src2_[(int)swizzle.GetSelectorSrc2(2)],
src2_[(int)swizzle.GetSelectorSrc2(3)], src2_[(int)swizzle.GetSelectorSrc2(3)],
}; };
if (negate_src2) {
src2[0] = src2[0] * float24::FromFloat32(-1);
src2[1] = src2[1] * float24::FromFloat32(-1);
src2[2] = src2[2] * float24::FromFloat32(-1);
src2[3] = src2[3] * float24::FromFloat32(-1);
}
switch (instr.opcode) { switch (instr.opcode) {
case Instruction::OpCode::ADD: case Instruction::OpCode::ADD:

View file

@ -66,7 +66,6 @@ struct OutputVertex {
static_assert(std::is_pod<OutputVertex>::value, "Structure is not POD"); static_assert(std::is_pod<OutputVertex>::value, "Structure is not POD");
static_assert(sizeof(OutputVertex) == 32 * sizeof(float), "OutputVertex has invalid size"); static_assert(sizeof(OutputVertex) == 32 * sizeof(float), "OutputVertex has invalid size");
void SubmitShaderMemoryChange(u32 addr, u32 value); void SubmitShaderMemoryChange(u32 addr, u32 value);
void SubmitSwizzleDataChange(u32 addr, u32 value); void SubmitSwizzleDataChange(u32 addr, u32 value);