Pica: Add primitive assembly stage.
This commit is contained in:
parent
c526512619
commit
9a76a2d061
|
@ -1,4 +1,5 @@
|
||||||
set(SRCS command_processor.cpp
|
set(SRCS command_processor.cpp
|
||||||
|
primitive_assembly.cpp
|
||||||
utils.cpp
|
utils.cpp
|
||||||
vertex_shader.cpp
|
vertex_shader.cpp
|
||||||
video_core.cpp
|
video_core.cpp
|
||||||
|
@ -6,6 +7,7 @@ set(SRCS command_processor.cpp
|
||||||
|
|
||||||
set(HEADERS command_processor.h
|
set(HEADERS command_processor.h
|
||||||
math.h
|
math.h
|
||||||
|
primitive_assembly.h
|
||||||
utils.h
|
utils.h
|
||||||
video_core.h
|
video_core.h
|
||||||
renderer_base.h
|
renderer_base.h
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include "command_processor.h"
|
#include "command_processor.h"
|
||||||
#include "math.h"
|
#include "math.h"
|
||||||
#include "pica.h"
|
#include "pica.h"
|
||||||
|
#include "primitive_assembly.h"
|
||||||
#include "vertex_shader.h"
|
#include "vertex_shader.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -100,7 +101,7 @@ static inline void WritePicaReg(u32 id, u32 value) {
|
||||||
// TODO: Add processed vertex to vertex cache!
|
// TODO: Add processed vertex to vertex cache!
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Submit vertex to primitive assembly
|
PrimitiveAssembly::SubmitVertex(output);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -221,7 +221,18 @@ struct Regs {
|
||||||
u32 trigger_draw;
|
u32 trigger_draw;
|
||||||
u32 trigger_draw_indexed;
|
u32 trigger_draw_indexed;
|
||||||
|
|
||||||
INSERT_PADDING_WORDS(0x8a);
|
INSERT_PADDING_WORDS(0x2e);
|
||||||
|
|
||||||
|
enum class TriangleTopology : u32 {
|
||||||
|
List = 0,
|
||||||
|
Strip = 1,
|
||||||
|
Fan = 2,
|
||||||
|
ListIndexed = 3, // TODO: No idea if this is correct
|
||||||
|
};
|
||||||
|
|
||||||
|
BitField<8, 2, TriangleTopology> triangle_topology;
|
||||||
|
|
||||||
|
INSERT_PADDING_WORDS(0x5b);
|
||||||
|
|
||||||
// Offset to shader program entry point (in words)
|
// Offset to shader program entry point (in words)
|
||||||
BitField<0, 16, u32> vs_main_offset;
|
BitField<0, 16, u32> vs_main_offset;
|
||||||
|
@ -334,6 +345,7 @@ struct Regs {
|
||||||
ADD_FIELD(num_vertices);
|
ADD_FIELD(num_vertices);
|
||||||
ADD_FIELD(trigger_draw);
|
ADD_FIELD(trigger_draw);
|
||||||
ADD_FIELD(trigger_draw_indexed);
|
ADD_FIELD(trigger_draw_indexed);
|
||||||
|
ADD_FIELD(triangle_topology);
|
||||||
ADD_FIELD(vs_main_offset);
|
ADD_FIELD(vs_main_offset);
|
||||||
ADD_FIELD(vs_input_register_map);
|
ADD_FIELD(vs_input_register_map);
|
||||||
ADD_FIELD(vs_uniform_setup);
|
ADD_FIELD(vs_uniform_setup);
|
||||||
|
@ -386,6 +398,7 @@ ASSERT_REG_POSITION(index_array, 0x227);
|
||||||
ASSERT_REG_POSITION(num_vertices, 0x228);
|
ASSERT_REG_POSITION(num_vertices, 0x228);
|
||||||
ASSERT_REG_POSITION(trigger_draw, 0x22e);
|
ASSERT_REG_POSITION(trigger_draw, 0x22e);
|
||||||
ASSERT_REG_POSITION(trigger_draw_indexed, 0x22f);
|
ASSERT_REG_POSITION(trigger_draw_indexed, 0x22f);
|
||||||
|
ASSERT_REG_POSITION(triangle_topology, 0x25e);
|
||||||
ASSERT_REG_POSITION(vs_main_offset, 0x2ba);
|
ASSERT_REG_POSITION(vs_main_offset, 0x2ba);
|
||||||
ASSERT_REG_POSITION(vs_input_register_map, 0x2bb);
|
ASSERT_REG_POSITION(vs_input_register_map, 0x2bb);
|
||||||
ASSERT_REG_POSITION(vs_uniform_setup, 0x2c0);
|
ASSERT_REG_POSITION(vs_uniform_setup, 0x2c0);
|
||||||
|
|
52
src/video_core/primitive_assembly.cpp
Normal file
52
src/video_core/primitive_assembly.cpp
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
// Copyright 2014 Citra Emulator Project
|
||||||
|
// Licensed under GPLv2
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#include "pica.h"
|
||||||
|
#include "primitive_assembly.h"
|
||||||
|
#include "vertex_shader.h"
|
||||||
|
|
||||||
|
namespace Pica {
|
||||||
|
|
||||||
|
namespace PrimitiveAssembly {
|
||||||
|
|
||||||
|
static OutputVertex buffer[2];
|
||||||
|
static int buffer_index = 0; // TODO: reset this on emulation restart
|
||||||
|
|
||||||
|
void SubmitVertex(OutputVertex& vtx)
|
||||||
|
{
|
||||||
|
switch (registers.triangle_topology) {
|
||||||
|
case Regs::TriangleTopology::List:
|
||||||
|
case Regs::TriangleTopology::ListIndexed:
|
||||||
|
if (buffer_index < 2) {
|
||||||
|
buffer[buffer_index++] = vtx;
|
||||||
|
} else {
|
||||||
|
buffer_index = 0;
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
// Clipper::ProcessTriangle(buffer[0], buffer[1], vtx);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Regs::TriangleTopology::Fan:
|
||||||
|
if (buffer_index == 2) {
|
||||||
|
buffer_index = 0;
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
// Clipper::ProcessTriangle(buffer[0], buffer[1], vtx);
|
||||||
|
|
||||||
|
buffer[1] = vtx;
|
||||||
|
} else {
|
||||||
|
buffer[buffer_index++] = vtx;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
ERROR_LOG(GPU, "Unknown triangle mode %x:", (int)registers.triangle_topology.Value());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
} // namespace
|
21
src/video_core/primitive_assembly.h
Normal file
21
src/video_core/primitive_assembly.h
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
// Copyright 2014 Citra Emulator Project
|
||||||
|
// Licensed under GPLv2
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace Pica {
|
||||||
|
|
||||||
|
namespace VertexShader {
|
||||||
|
struct OutputVertex;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace PrimitiveAssembly {
|
||||||
|
|
||||||
|
using VertexShader::OutputVertex;
|
||||||
|
|
||||||
|
void SubmitVertex(OutputVertex& vtx);
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
} // namespace
|
|
@ -21,6 +21,7 @@
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClCompile Include="renderer_opengl\renderer_opengl.cpp" />
|
<ClCompile Include="renderer_opengl\renderer_opengl.cpp" />
|
||||||
<ClCompile Include="command_processor.cpp" />
|
<ClCompile Include="command_processor.cpp" />
|
||||||
|
<ClCompile Include="primitive_assembly.cpp" />
|
||||||
<ClCompile Include="utils.cpp" />
|
<ClCompile Include="utils.cpp" />
|
||||||
<ClCompile Include="vertex_shader.cpp" />
|
<ClCompile Include="vertex_shader.cpp" />
|
||||||
<ClCompile Include="video_core.cpp" />
|
<ClCompile Include="video_core.cpp" />
|
||||||
|
@ -30,6 +31,7 @@
|
||||||
<ClInclude Include="gpu_debugger.h" />
|
<ClInclude Include="gpu_debugger.h" />
|
||||||
<ClInclude Include="math.h" />
|
<ClInclude Include="math.h" />
|
||||||
<ClInclude Include="pica.h" />
|
<ClInclude Include="pica.h" />
|
||||||
|
<ClInclude Include="primitive_assembly.h" />
|
||||||
<ClInclude Include="renderer_base.h" />
|
<ClInclude Include="renderer_base.h" />
|
||||||
<ClInclude Include="utils.h" />
|
<ClInclude Include="utils.h" />
|
||||||
<ClInclude Include="vertex_shader.h" />
|
<ClInclude Include="vertex_shader.h" />
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
<Filter>renderer_opengl</Filter>
|
<Filter>renderer_opengl</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="command_processor.cpp" />
|
<ClCompile Include="command_processor.cpp" />
|
||||||
|
<ClCompile Include="primitive_assembly.cpp" />
|
||||||
<ClCompile Include="utils.cpp" />
|
<ClCompile Include="utils.cpp" />
|
||||||
<ClCompile Include="vertex_shader.cpp" />
|
<ClCompile Include="vertex_shader.cpp" />
|
||||||
<ClCompile Include="video_core.cpp" />
|
<ClCompile Include="video_core.cpp" />
|
||||||
|
@ -22,6 +23,7 @@
|
||||||
<ClInclude Include="gpu_debugger.h" />
|
<ClInclude Include="gpu_debugger.h" />
|
||||||
<ClInclude Include="math.h" />
|
<ClInclude Include="math.h" />
|
||||||
<ClInclude Include="pica.h" />
|
<ClInclude Include="pica.h" />
|
||||||
|
<ClInclude Include="primitive_assembly.h" />
|
||||||
<ClInclude Include="renderer_base.h" />
|
<ClInclude Include="renderer_base.h" />
|
||||||
<ClInclude Include="utils.h" />
|
<ClInclude Include="utils.h" />
|
||||||
<ClInclude Include="vertex_shader.h" />
|
<ClInclude Include="vertex_shader.h" />
|
||||||
|
|
Loading…
Reference in a new issue