Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.34 KB | None | 0 0
  1. typedef unsigned int uint32;
  2. typedef unsigned long long uint;
  3.  
  4. struct Vertex2D
  5. {
  6.     Vertex2D(float x, float y, uint32 color)
  7.     {
  8.         position = { x, y };
  9.         this->color = color;
  10.     }
  11.  
  12.     Vector2<float> position;
  13.     uint32 color;
  14. };
  15.  
  16. struct Range
  17. {
  18.     //Begin of the buffer
  19.     uint begin = 0;
  20.  
  21.     GLsync sync = 0;
  22. };
  23.  
  24. struct Renderer
  25. {
  26.     Renderer() = default;
  27.     ~Renderer()
  28.     {
  29.         glUnmapNamedBuffer(vbo);
  30.         glDeleteBuffers(1, &vbo);
  31.  
  32.         glDeleteVertexArrays(1, &vao);
  33.     }
  34.  
  35.     //triple buffering
  36.     static const int bufferCount = 3;
  37.     static const int quadVertexCount = 4;
  38.     //First frame = 0; second frame = 1; third frame = 2; fourth = 0; fifth = 1; ... etc.
  39.     int rangeIndex = 0;
  40.  
  41.     Range ranges[bufferCount];
  42.  
  43.     int waitCount = 0;
  44.  
  45.     void Create()
  46.     {
  47.         shader = shader.Create("assets/shaders/renderer.glsl");
  48.  
  49.         auto mapBit = GL_MAP_WRITE_BIT | GL_MAP_COHERENT_BIT | GL_MAP_PERSISTENT_BIT;
  50.  
  51.         glCreateVertexArrays(1, &vao);
  52.         glBindVertexArray(vao);
  53.  
  54.         glGenBuffers(1, &vbo);
  55.         glBindBuffer(GL_ARRAY_BUFFER, vbo);
  56.  
  57.         glNamedBufferStorage(vbo, bufferCount * 4 * sizeof(Vertex2D), nullptr, mapBit);
  58.  
  59.         glEnableVertexAttribArray(0);
  60.         glEnableVertexAttribArray(1);
  61.  
  62.         glVertexAttribPointer(0, 2, GL_FLOAT, false, sizeof(Vertex2D), (const void*)offsetof(Vertex2D, position));
  63.         glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, true, sizeof(Vertex2D), (const void*)offsetof(Vertex2D, color));
  64.  
  65.         mappedVertex = (Vertex2D*)glMapNamedBufferRange(vbo, NULL, bufferCount * quadVertexCount * sizeof(Vertex2D), mapBit);
  66.  
  67.         ranges[0].begin = 0;
  68.         ranges[1].begin = quadVertexCount;
  69.         ranges[2].begin = quadVertexCount * 2;
  70.     }
  71.  
  72.     void LockBuffer(GLsync& syncObject)
  73.     {
  74.         if (syncObject) {
  75.             glDeleteSync(syncObject);
  76.         }
  77.  
  78.         syncObject = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
  79.     }
  80.  
  81.     void WaitBuffer(GLsync& syncObject)
  82.     {
  83.         if (syncObject) {
  84.             while (true) {
  85.                 auto waitReturn = glClientWaitSync(syncObject, GL_SYNC_FLUSH_COMMANDS_BIT, 1);
  86.                 if (waitReturn == GL_ALREADY_SIGNALED || waitReturn == GL_CONDITION_SATISFIED)
  87.                     return;
  88.  
  89.                 waitCount++;
  90.             }
  91.         }
  92.     }
  93.  
  94.     void Begin()
  95.     {
  96.         vertices.clear();
  97.     }
  98.  
  99.     void FillRect(float x, float y, float w, float h, uint32 color)
  100.     {
  101.         vertices.push_back(Vertex2D(x, y, color));
  102.         vertices.push_back(Vertex2D(x, y + h, color));
  103.         vertices.push_back(Vertex2D(x + w, y + h, color));
  104.         vertices.push_back(Vertex2D(x + w, y, color));
  105.     }
  106.  
  107.     void Lock()
  108.     {
  109.         WaitBuffer(ranges[rangeIndex].sync);
  110.     }
  111.  
  112.     void RenderPresent()
  113.     {
  114.         Lock();
  115.  
  116.         glBindVertexArray(vao);
  117.  
  118.         //Clear CPU data
  119.         Begin();
  120.         //Fill CPU data
  121.         FillRect(10.0f, 10.0f, 50.0f, 50.0, 0xff00ffff);
  122.  
  123.         //Pass CPU data to the GPU
  124.         memcpy(&mappedVertex[ranges[rangeIndex].begin], vertices.data(), sizeof(Vertex2D) * vertices.size());
  125.         //Draw
  126.         glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
  127.  
  128.         //Clear old CPU data
  129.         Begin();
  130.         //Fill CPU data
  131.         FillRect(10.0f, 60.0f, 50.0f, 50.0f, 0xffffffff);
  132.         //Pass CPU data to the GPU
  133.         memcpy(&mappedVertex[ranges[rangeIndex].begin], vertices.data(), sizeof(Vertex2D) * vertices.size());
  134.         //Draw
  135.         glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
  136.  
  137.         Unlock();
  138.     }
  139.  
  140.     void Unlock()
  141.     {
  142.         LockBuffer(ranges[rangeIndex].sync);
  143.         rangeIndex = (rangeIndex + 1) % bufferCount;
  144.     }
  145.  
  146.     Shader shader;
  147.  
  148.     GLuint vao;
  149.     GLuint vbo;
  150.  
  151.     Vertex2D* mappedVertex = nullptr;
  152.  
  153.     std::vector<Vertex2D> vertices;
  154. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement