primitive_assembly.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // Copyright 2014 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include "common/logging/log.h"
  5. #include "video_core/pica.h"
  6. #include "video_core/primitive_assembly.h"
  7. #include "video_core/debug_utils/debug_utils.h"
  8. #include "video_core/shader/shader_interpreter.h"
  9. namespace Pica {
  10. template<typename VertexType>
  11. PrimitiveAssembler<VertexType>::PrimitiveAssembler(Regs::TriangleTopology topology)
  12. : topology(topology), buffer_index(0) {
  13. }
  14. template<typename VertexType>
  15. void PrimitiveAssembler<VertexType>::SubmitVertex(VertexType& vtx, TriangleHandler triangle_handler)
  16. {
  17. switch (topology) {
  18. // TODO: Figure out what's different with TriangleTopology::Shader.
  19. case Regs::TriangleTopology::List:
  20. case Regs::TriangleTopology::Shader:
  21. if (buffer_index < 2) {
  22. buffer[buffer_index++] = vtx;
  23. } else {
  24. buffer_index = 0;
  25. triangle_handler(buffer[0], buffer[1], vtx);
  26. }
  27. break;
  28. case Regs::TriangleTopology::Strip:
  29. case Regs::TriangleTopology::Fan:
  30. if (strip_ready)
  31. triangle_handler(buffer[0], buffer[1], vtx);
  32. buffer[buffer_index] = vtx;
  33. if (topology == Regs::TriangleTopology::Strip) {
  34. strip_ready |= (buffer_index == 1);
  35. buffer_index = !buffer_index;
  36. } else if (topology == Regs::TriangleTopology::Fan) {
  37. buffer_index = 1;
  38. strip_ready = true;
  39. }
  40. break;
  41. default:
  42. LOG_ERROR(HW_GPU, "Unknown triangle topology %x:", (int)topology);
  43. break;
  44. }
  45. }
  46. // explicitly instantiate use cases
  47. template
  48. struct PrimitiveAssembler<Shader::OutputVertex>;
  49. template
  50. struct PrimitiveAssembler<DebugUtils::GeometryDumper::Vertex>;
  51. } // namespace