Pica: Add primitive assembly stage.
This commit is contained in:
parent
c526512619
commit
9a76a2d061
|
@ -1,4 +1,5 @@
|
|||
set(SRCS command_processor.cpp
|
||||
primitive_assembly.cpp
|
||||
utils.cpp
|
||||
vertex_shader.cpp
|
||||
video_core.cpp
|
||||
|
@ -6,6 +7,7 @@ set(SRCS command_processor.cpp
|
|||
|
||||
set(HEADERS command_processor.h
|
||||
math.h
|
||||
primitive_assembly.h
|
||||
utils.h
|
||||
video_core.h
|
||||
renderer_base.h
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include "command_processor.h"
|
||||
#include "math.h"
|
||||
#include "pica.h"
|
||||
#include "primitive_assembly.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: Submit vertex to primitive assembly
|
||||
PrimitiveAssembly::SubmitVertex(output);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -221,7 +221,18 @@ struct Regs {
|
|||
u32 trigger_draw;
|
||||
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)
|
||||
BitField<0, 16, u32> vs_main_offset;
|
||||
|
@ -334,6 +345,7 @@ struct Regs {
|
|||
ADD_FIELD(num_vertices);
|
||||
ADD_FIELD(trigger_draw);
|
||||
ADD_FIELD(trigger_draw_indexed);
|
||||
ADD_FIELD(triangle_topology);
|
||||
ADD_FIELD(vs_main_offset);
|
||||
ADD_FIELD(vs_input_register_map);
|
||||
ADD_FIELD(vs_uniform_setup);
|
||||
|
@ -386,6 +398,7 @@ ASSERT_REG_POSITION(index_array, 0x227);
|
|||
ASSERT_REG_POSITION(num_vertices, 0x228);
|
||||
ASSERT_REG_POSITION(trigger_draw, 0x22e);
|
||||
ASSERT_REG_POSITION(trigger_draw_indexed, 0x22f);
|
||||
ASSERT_REG_POSITION(triangle_topology, 0x25e);
|
||||
ASSERT_REG_POSITION(vs_main_offset, 0x2ba);
|
||||
ASSERT_REG_POSITION(vs_input_register_map, 0x2bb);
|
||||
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>
|
||||
<ClCompile Include="renderer_opengl\renderer_opengl.cpp" />
|
||||
<ClCompile Include="command_processor.cpp" />
|
||||
<ClCompile Include="primitive_assembly.cpp" />
|
||||
<ClCompile Include="utils.cpp" />
|
||||
<ClCompile Include="vertex_shader.cpp" />
|
||||
<ClCompile Include="video_core.cpp" />
|
||||
|
@ -30,6 +31,7 @@
|
|||
<ClInclude Include="gpu_debugger.h" />
|
||||
<ClInclude Include="math.h" />
|
||||
<ClInclude Include="pica.h" />
|
||||
<ClInclude Include="primitive_assembly.h" />
|
||||
<ClInclude Include="renderer_base.h" />
|
||||
<ClInclude Include="utils.h" />
|
||||
<ClInclude Include="vertex_shader.h" />
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
<Filter>renderer_opengl</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="command_processor.cpp" />
|
||||
<ClCompile Include="primitive_assembly.cpp" />
|
||||
<ClCompile Include="utils.cpp" />
|
||||
<ClCompile Include="vertex_shader.cpp" />
|
||||
<ClCompile Include="video_core.cpp" />
|
||||
|
@ -22,6 +23,7 @@
|
|||
<ClInclude Include="gpu_debugger.h" />
|
||||
<ClInclude Include="math.h" />
|
||||
<ClInclude Include="pica.h" />
|
||||
<ClInclude Include="primitive_assembly.h" />
|
||||
<ClInclude Include="renderer_base.h" />
|
||||
<ClInclude Include="utils.h" />
|
||||
<ClInclude Include="vertex_shader.h" />
|
||||
|
|
Loading…
Reference in a new issue