GrGLSLVertexGeoBuilder.cpp 3.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /*
  2. * Copyright 2017 Google Inc.
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #include "src/gpu/glsl/GrGLSLVertexGeoBuilder.h"
  8. #include "include/gpu/GrTypes.h"
  9. #include "src/gpu/glsl/GrGLSLProgramBuilder.h"
  10. #include "src/gpu/glsl/GrGLSLVarying.h"
  11. void GrGLSLVertexGeoBuilder::emitNormalizedSkPosition(SkString* out, const char* devPos,
  12. const char* rtAdjustName,
  13. GrSLType devPosType) {
  14. if (this->getProgramBuilder()->desc()->header().fSnapVerticesToPixelCenters) {
  15. if (kFloat3_GrSLType == devPosType) {
  16. const char* p = devPos;
  17. out->appendf("{float2 _posTmp = float2(%s.x/%s.z, %s.y/%s.z);", p, p, p, p);
  18. } else {
  19. SkASSERT(kFloat2_GrSLType == devPosType);
  20. out->appendf("{float2 _posTmp = %s;", devPos);
  21. }
  22. out->appendf("_posTmp = floor(_posTmp) + half2(0.5, 0.5);"
  23. "sk_Position = float4(_posTmp, 0, 1);}");
  24. } else if (kFloat3_GrSLType == devPosType) {
  25. out->appendf("sk_Position = float4(%s.x , %s.y, 0, %s.z);",
  26. devPos, devPos, devPos);
  27. } else {
  28. SkASSERT(kFloat2_GrSLType == devPosType);
  29. out->appendf("sk_Position = float4(%s.x , %s.y, 0, 1);",
  30. devPos, devPos);
  31. }
  32. }
  33. void GrGLSLVertexBuilder::onFinalize() {
  34. // We could have the GrGeometryProcessor do this, but its just easier to have it performed
  35. // here. If we ever need to set variable pointsize, then we can reinvestigate.
  36. if (this->getProgramBuilder()->desc()->header().fHasPointSize) {
  37. this->codeAppend("sk_PointSize = 1.0;");
  38. }
  39. fProgramBuilder->varyingHandler()->getVertexDecls(&this->inputs(), &this->outputs());
  40. }
  41. static const char* input_type_name(GrGLSLGeometryBuilder::InputType in) {
  42. using InputType = GrGLSLGeometryBuilder::InputType;
  43. switch (in) {
  44. case InputType::kPoints: return "points";
  45. case InputType::kLines: return "lines";
  46. case InputType::kLinesAdjacency: return "lines_adjacency";
  47. case InputType::kTriangles: return "triangles";
  48. case InputType::kTrianglesAdjacency: return "triangles_adjacency";
  49. }
  50. SK_ABORT("invalid input type");
  51. return "unknown_input";
  52. }
  53. static const char* output_type_name(GrGLSLGeometryBuilder::OutputType out) {
  54. using OutputType = GrGLSLGeometryBuilder::OutputType;
  55. switch (out) {
  56. case OutputType::kPoints: return "points";
  57. case OutputType::kLineStrip: return "line_strip";
  58. case OutputType::kTriangleStrip: return "triangle_strip";
  59. }
  60. SK_ABORT("invalid output type");
  61. return "unknown_output";
  62. }
  63. void GrGLSLGeometryBuilder::configure(InputType inputType, OutputType outputType, int maxVertices,
  64. int numInvocations) {
  65. SkASSERT(!this->isConfigured());
  66. fNumInvocations = numInvocations;
  67. this->addLayoutQualifier(input_type_name(inputType), kIn_InterfaceQualifier);
  68. this->addLayoutQualifier(SkStringPrintf("invocations = %i", numInvocations).c_str(),
  69. kIn_InterfaceQualifier);
  70. this->addLayoutQualifier(output_type_name(outputType), kOut_InterfaceQualifier);
  71. this->addLayoutQualifier(SkStringPrintf("max_vertices = %i", maxVertices).c_str(),
  72. kOut_InterfaceQualifier);
  73. }
  74. void GrGLSLGeometryBuilder::emitVertex(SkString* out, const char* devPos, const char* rtAdjustName,
  75. GrSLType devPosType) {
  76. this->emitNormalizedSkPosition(out, devPos, rtAdjustName, devPosType);
  77. out->append("EmitVertex();");
  78. }
  79. void GrGLSLGeometryBuilder::endPrimitive() {
  80. this->codeAppend("EndPrimitive();");
  81. }
  82. void GrGLSLGeometryBuilder::onFinalize() {
  83. SkASSERT(this->isConfigured());
  84. fProgramBuilder->varyingHandler()->getGeomDecls(&this->inputs(), &this->outputs());
  85. }