pica.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. // Copyright 2015 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <cstring>
  5. #include "video_core/geometry_pipeline.h"
  6. #include "video_core/pica.h"
  7. #include "video_core/pica_state.h"
  8. #include "video_core/renderer_base.h"
  9. #include "video_core/video_core.h"
  10. namespace Pica {
  11. State g_state;
  12. void Init() {
  13. g_state.Reset();
  14. }
  15. void Shutdown() {
  16. Shader::Shutdown();
  17. }
  18. template <typename T>
  19. void Zero(T& o) {
  20. memset(&o, 0, sizeof(o));
  21. }
  22. State::State() : geometry_pipeline(*this) {
  23. auto SubmitVertex = [this](const Shader::AttributeBuffer& vertex) {
  24. using Pica::Shader::OutputVertex;
  25. auto AddTriangle = [this](const OutputVertex& v0, const OutputVertex& v1,
  26. const OutputVertex& v2) {
  27. VideoCore::g_renderer->Rasterizer()->AddTriangle(v0, v1, v2);
  28. };
  29. primitive_assembler.SubmitVertex(
  30. Shader::OutputVertex::FromAttributeBuffer(regs.rasterizer, vertex), AddTriangle);
  31. };
  32. auto SetWinding = [this]() { primitive_assembler.SetWinding(); };
  33. g_state.gs_unit.SetVertexHandler(SubmitVertex, SetWinding);
  34. g_state.geometry_pipeline.SetVertexHandler(SubmitVertex);
  35. }
  36. void State::Reset() {
  37. Zero(regs);
  38. Zero(vs);
  39. Zero(gs);
  40. Zero(cmd_list);
  41. Zero(immediate);
  42. primitive_assembler.Reconfigure(PipelineRegs::TriangleTopology::List);
  43. }
  44. }