primitive_assembly.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. // Copyright 2014 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include "pica.h"
  5. #include "primitive_assembly.h"
  6. #include "vertex_shader.h"
  7. #include "common/logging/log.h"
  8. #include "video_core/debug_utils/debug_utils.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. case Regs::TriangleTopology::List:
  19. case Regs::TriangleTopology::ListIndexed:
  20. if (buffer_index < 2) {
  21. buffer[buffer_index++] = vtx;
  22. } else {
  23. buffer_index = 0;
  24. triangle_handler(buffer[0], buffer[1], vtx);
  25. }
  26. break;
  27. case Regs::TriangleTopology::Strip:
  28. case Regs::TriangleTopology::Fan:
  29. if (strip_ready)
  30. triangle_handler(buffer[0], buffer[1], vtx);
  31. buffer[buffer_index] = vtx;
  32. if (topology == Regs::TriangleTopology::Strip) {
  33. strip_ready |= (buffer_index == 1);
  34. buffer_index = !buffer_index;
  35. } else if (topology == Regs::TriangleTopology::Fan) {
  36. buffer_index = 1;
  37. strip_ready = true;
  38. }
  39. break;
  40. default:
  41. LOG_ERROR(HW_GPU, "Unknown triangle topology %x:", (int)topology);
  42. break;
  43. }
  44. }
  45. // explicitly instantiate use cases
  46. template
  47. struct PrimitiveAssembler<VertexShader::OutputVertex>;
  48. template
  49. struct PrimitiveAssembler<DebugUtils::GeometryDumper::Vertex>;
  50. } // namespace