primitive_assembly.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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/primitive_assembly.h"
  6. #include "video_core/regs_pipeline.h"
  7. #include "video_core/shader/shader.h"
  8. namespace Pica {
  9. template <typename VertexType>
  10. PrimitiveAssembler<VertexType>::PrimitiveAssembler(PipelineRegs::TriangleTopology topology)
  11. : topology(topology), buffer_index(0) {}
  12. template <typename VertexType>
  13. void PrimitiveAssembler<VertexType>::SubmitVertex(const VertexType& vtx,
  14. TriangleHandler triangle_handler) {
  15. switch (topology) {
  16. // TODO: Figure out what's different with TriangleTopology::Shader.
  17. case PipelineRegs::TriangleTopology::List:
  18. case PipelineRegs::TriangleTopology::Shader:
  19. if (buffer_index < 2) {
  20. buffer[buffer_index++] = vtx;
  21. } else {
  22. buffer_index = 0;
  23. triangle_handler(buffer[0], buffer[1], vtx);
  24. }
  25. break;
  26. case PipelineRegs::TriangleTopology::Strip:
  27. case PipelineRegs::TriangleTopology::Fan:
  28. if (strip_ready)
  29. triangle_handler(buffer[0], buffer[1], vtx);
  30. buffer[buffer_index] = vtx;
  31. strip_ready |= (buffer_index == 1);
  32. if (topology == PipelineRegs::TriangleTopology::Strip)
  33. buffer_index = !buffer_index;
  34. else if (topology == PipelineRegs::TriangleTopology::Fan)
  35. buffer_index = 1;
  36. break;
  37. default:
  38. LOG_ERROR(HW_GPU, "Unknown triangle topology %x:", (int)topology);
  39. break;
  40. }
  41. }
  42. template <typename VertexType>
  43. void PrimitiveAssembler<VertexType>::Reset() {
  44. buffer_index = 0;
  45. strip_ready = false;
  46. }
  47. template <typename VertexType>
  48. void PrimitiveAssembler<VertexType>::Reconfigure(PipelineRegs::TriangleTopology topology) {
  49. Reset();
  50. this->topology = topology;
  51. }
  52. // explicitly instantiate use cases
  53. template struct PrimitiveAssembler<Shader::OutputVertex>;
  54. } // namespace