summaryrefslogtreecommitdiff
path: root/src/ral/backends/opengl/backend_opengl.c
diff options
context:
space:
mode:
authoromniscient <17525998+omnisci3nce@users.noreply.github.com>2024-10-05 12:48:05 +1000
committeromniscient <17525998+omnisci3nce@users.noreply.github.com>2024-10-05 12:48:05 +1000
commitdfb6adbcbcc7d50b770b6d5ea82efdd8f8c32e25 (patch)
treea470b91a90716d7ea46fde53ed395449c24583a2 /src/ral/backends/opengl/backend_opengl.c
parent54354e32c6498cc7f8839ab4deb1208d37216cc5 (diff)
delete documentation workflow
Diffstat (limited to 'src/ral/backends/opengl/backend_opengl.c')
-rw-r--r--src/ral/backends/opengl/backend_opengl.c449
1 files changed, 0 insertions, 449 deletions
diff --git a/src/ral/backends/opengl/backend_opengl.c b/src/ral/backends/opengl/backend_opengl.c
deleted file mode 100644
index 613d7e1..0000000
--- a/src/ral/backends/opengl/backend_opengl.c
+++ /dev/null
@@ -1,449 +0,0 @@
-#include "backend_opengl.h"
-#include "colours.h"
-#include "maths_types.h"
-#if defined(CEL_REND_BACKEND_OPENGL)
-#include <assert.h>
-#include "log.h"
-#include "mem.h"
-#include "opengl_helpers.h"
-#include "ral_common.h"
-#include "ral_impl.h"
-#include "ral_types.h"
-
-#include <glad/glad.h>
-#include <glfw3.h>
-
-typedef struct OpenglCtx {
- GLFWwindow* window;
- arena pool_arena;
- GPU_Swapchain swapchain;
- GPU_CmdEncoder main_encoder;
- GPU_BackendPools gpu_pools;
- ResourcePools* resource_pools;
-} OpenglCtx;
-
-static OpenglCtx context;
-
-bool GPU_Backend_Init(const char* window_name, struct GLFWwindow* window,
- struct ResourcePools* res_pools) {
- INFO("loading OpenGL backend");
-
- memset(&context, 0, sizeof(context));
- context.window = window;
-
- size_t pool_buffer_size = 1024 * 1024;
- context.pool_arena = arena_create(malloc(pool_buffer_size), pool_buffer_size);
-
- BackendPools_Init(&context.pool_arena, &context.gpu_pools);
- context.resource_pools = res_pools;
-
- glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
- glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 1);
- glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
- glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
-
- // glad: load all opengl function pointers
- if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {
- ERROR("Failed to initialise GLAD \n");
- return false;
- }
-
- glEnable(GL_DEPTH_TEST);
- glEnable(GL_CULL_FACE);
-
- context.swapchain = (GPU_Swapchain){ .dimensions = u32x2(1000, 1000) };
-
- return true;
-}
-
-// All of these are no-ops in OpenGL
-void GPU_Backend_Shutdown() { /* TODO */ }
-bool GPU_Device_Create(GPU_Device* out_device) { return true; }
-void GPU_Device_Destroy(GPU_Device* device) {}
-bool GPU_Swapchain_Create(GPU_Swapchain* out_swapchain) { return true; }
-void GPU_Swapchain_Destroy(GPU_Swapchain* swapchain) {}
-void GPU_CmdEncoder_Destroy(GPU_CmdEncoder* encoder) {}
-
-void GPU_CmdEncoder_BeginRender(GPU_CmdEncoder* encoder, GPU_Renderpass* renderpass) {
- glBindFramebuffer(GL_FRAMEBUFFER, renderpass->fbo);
- // rgba clear_colour = STONE_800;
- // glClearColor(clear_colour.r, clear_colour.g, clear_colour.b, 1.0f);
- // if (renderpass->description.has_depth_stencil) {
- // glClear(GL_DEPTH_BUFFER_BIT);
- // } else {
- // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- // }
-}
-
-void GPU_CmdEncoder_EndRender(GPU_CmdEncoder* encoder) { glBindFramebuffer(GL_FRAMEBUFFER, 0); }
-
-GPU_CmdEncoder* GPU_GetDefaultEncoder() { return &context.main_encoder; }
-void GPU_QueueSubmit(GPU_CmdBuffer* cmd_buffer) {}
-
-void GPU_Swapchain_Resize(i32 new_width, i32 new_height) {
- context.swapchain.dimensions = u32x2(new_width, new_height);
-}
-
-u32x2 GPU_Swapchain_GetDimensions() { return context.swapchain.dimensions; }
-
-GPU_Renderpass* GPU_Renderpass_Create(GPU_RenderpassDesc description) {
- // allocate new pass
- GPU_Renderpass* renderpass = Renderpass_pool_alloc(&context.gpu_pools.renderpasses, NULL);
- renderpass->description = description;
-
- if (!description.default_framebuffer) {
- // If we're not using the default framebuffer we need to generate a new one
- GLuint gl_fbo_id;
- glGenFramebuffers(1, &gl_fbo_id);
- renderpass->fbo = gl_fbo_id;
- } else {
- renderpass->fbo = OPENGL_DEFAULT_FRAMEBUFFER;
- assert(!description.has_color_target);
- assert(!description.has_depth_stencil);
- }
- glBindFramebuffer(GL_FRAMEBUFFER, renderpass->fbo);
-
- if (description.has_color_target && !description.default_framebuffer) {
- GPU_Texture* colour_attachment = TEXTURE_GET(description.color_target);
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
- colour_attachment->id, 0);
- }
- if (description.has_depth_stencil && !description.default_framebuffer) {
- GPU_Texture* depth_attachment = TEXTURE_GET(description.depth_stencil);
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth_attachment->id,
- 0);
- }
-
- if (description.has_depth_stencil && !description.has_color_target) {
- glDrawBuffer(GL_NONE);
- glReadBuffer(GL_NONE);
- }
-
- glBindFramebuffer(GL_FRAMEBUFFER, 0); // reset to default framebuffer
-
- return renderpass;
-}
-
-void GPU_Renderpass_Destroy(GPU_Renderpass* pass) { glDeleteFramebuffers(1, &pass->fbo); }
-
-GPU_Pipeline* GPU_GraphicsPipeline_Create(GraphicsPipelineDesc description,
- GPU_Renderpass* renderpass) {
- GPU_Pipeline* pipeline = Pipeline_pool_alloc(&context.gpu_pools.pipelines, NULL);
-
- // Create shader program
- u32 shader_id = shader_create_separate(description.vs.filepath.buf, description.fs.filepath.buf);
- pipeline->shader_id = shader_id;
-
- // Vertex format
- pipeline->vertex_desc = description.vertex_desc;
-
- // Allocate uniform buffers if needed
- u32 ubo_count = 0;
- // printf("data layouts %d\n", description.data_layouts_count);
- for (u32 layout_i = 0; layout_i < description.data_layouts_count; layout_i++) {
- ShaderDataLayout sdl = description.data_layouts[layout_i];
- TRACE("Got shader data layout %d's bindings! . found %d", layout_i, sdl.binding_count);
-
- for (u32 binding_j = 0; binding_j < sdl.binding_count; binding_j++) {
- u32 binding_id = binding_j;
- assert(binding_id < MAX_PIPELINE_UNIFORM_BUFFERS);
- ShaderBinding binding = sdl.bindings[binding_j];
- // Do I want Buffer vs Bytes?
- if (binding.kind == BINDING_BYTES) {
- static u32 s_binding_point = 0;
- BufferHandle ubo_handle = GPU_BufferCreate(binding.data.bytes.size, BUFFER_UNIFORM,
- BUFFER_FLAG_GPU, NULL); // no data right now
- pipeline->uniform_bindings[ubo_count++] = ubo_handle;
- GPU_Buffer* ubo_buf = BUFFER_GET(ubo_handle);
-
- i32 blockIndex = glGetUniformBlockIndex(pipeline->shader_id, binding.label);
- printf("Block index for %s: %d", binding.label, blockIndex);
- if (blockIndex < 0) {
- WARN("Couldn't retrieve block index for uniform block '%s'", binding.label);
- } else {
- // DEBUG("Retrived block index %d for %s", blockIndex, binding.label);
- }
- u32 blocksize;
- glGetActiveUniformBlockiv(pipeline->shader_id, blockIndex, GL_UNIFORM_BLOCK_DATA_SIZE,
- &blocksize);
- printf("\t with size %d bytes\n", blocksize);
-
- glBindBufferBase(GL_UNIFORM_BUFFER, s_binding_point, ubo_buf->id.ubo);
- if (blockIndex != GL_INVALID_INDEX) {
- glUniformBlockBinding(pipeline->shader_id, blockIndex, s_binding_point);
- }
- ubo_buf->ubo_binding_point = s_binding_point++;
- ubo_buf->name = binding.label;
- assert(s_binding_point < GL_MAX_UNIFORM_BUFFER_BINDINGS);
- }
- }
- }
- pipeline->uniform_count = ubo_count;
-
- pipeline->renderpass = renderpass;
- pipeline->wireframe = description.wireframe;
-
- return pipeline;
-}
-
-void GraphicsPipeline_Destroy(GPU_Pipeline* pipeline) {}
-
-GPU_CmdEncoder GPU_CmdEncoder_Create() {
- GPU_CmdEncoder encoder = { 0 };
- return encoder;
-}
-
-BufferHandle GPU_BufferCreate(u64 size, GPU_BufferType buf_type, GPU_BufferFlags flags,
- const void* data) {
- // "allocating" the cpu-side buffer struct
- BufferHandle handle;
- GPU_Buffer* buffer = Buffer_pool_alloc(&context.resource_pools->buffers, &handle);
- buffer->size = size;
- buffer->vao = 0;
-
- // Opengl buffer
- GLuint gl_buffer_id;
- glGenBuffers(1, &gl_buffer_id);
-
- GLenum gl_buf_type;
- GLenum gl_buf_usage = GL_STATIC_DRAW;
-
- switch (buf_type) {
- case BUFFER_UNIFORM:
- DEBUG("Creating Uniform buffer");
- gl_buf_type = GL_UNIFORM_BUFFER;
- /* gl_buf_usage = GL_DYNAMIC_DRAW; */
- buffer->id.ubo = gl_buffer_id;
- break;
- case BUFFER_DEFAULT:
- case BUFFER_VERTEX:
- DEBUG("Creating Vertex buffer");
- gl_buf_type = GL_ARRAY_BUFFER;
- buffer->id.vbo = gl_buffer_id;
- break;
- case BUFFER_INDEX:
- DEBUG("Creating Index buffer");
- gl_buf_type = GL_ELEMENT_ARRAY_BUFFER;
- buffer->id.ibo = gl_buffer_id;
- break;
- default:
- WARN("Unimplemented gpu_buffer_type provided %s", buffer_type_names[buf_type]);
- break;
- }
- // bind buffer
- glBindBuffer(gl_buf_type, gl_buffer_id);
-
- if (data) {
- TRACE("Upload data (%d bytes) as part of buffer creation", size);
- glBufferData(gl_buf_type, buffer->size, data, gl_buf_usage);
- } else {
- TRACE("Allocating but not uploading (%d bytes)", size);
- glBufferData(gl_buf_type, buffer->size, NULL, gl_buf_usage);
- }
-
- glBindBuffer(gl_buf_type, 0);
-
- return handle;
-}
-
-void GPU_BufferDestroy(BufferHandle handle) { glDeleteBuffers(1, &handle.raw); }
-
-TextureHandle GPU_TextureCreate(TextureDesc desc, bool create_view, const void* data) {
- // "allocating" the cpu-side struct
- TextureHandle handle;
- GPU_Texture* texture = Texture_pool_alloc(&context.resource_pools->textures, &handle);
- DEBUG("Allocated texture with handle %d", handle.raw);
-
- GLuint gl_texture_id;
- glGenTextures(1, &gl_texture_id);
- texture->id = gl_texture_id;
-
- GLenum gl_tex_type = opengl_tex_type(desc.tex_type);
- texture->type = desc.tex_type;
- printf("Creating texture of type %s\n", texture_type_names[desc.tex_type]);
- glBindTexture(gl_tex_type, gl_texture_id);
-
- GLint internal_format;
- if (desc.format == TEXTURE_FORMAT_DEPTH_DEFAULT) {
- internal_format = GL_DEPTH_COMPONENT;
- } else if (desc.format == TEXTURE_FORMAT_8_8_8_8_RGBA_UNORM) {
- internal_format = GL_RGBA;
- } else {
- internal_format = GL_RGB;
- }
-
- GLint format = internal_format;
- // FIXME: GLint format = desc.format == TEXTURE_FORMAT_DEPTH_DEFAULT ? GL_DEPTH_COMPONENT :
- // GL_RGBA;
- GLenum data_type = desc.format == TEXTURE_FORMAT_DEPTH_DEFAULT ? GL_FLOAT : GL_UNSIGNED_BYTE;
-
- if (desc.format == TEXTURE_FORMAT_DEPTH_DEFAULT) {
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
- } else {
- // set the texture wrapping parameters
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
- GL_REPEAT); // set texture wrapping to GL_REPEAT (default wrapping method)
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
- // set texture filtering parameters
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- }
-
- if (data) {
- glTexImage2D(GL_TEXTURE_2D, 0, internal_format, desc.extents.x, desc.extents.y, 0, format,
- data_type, data);
- if (desc.tex_type == TEXTURE_TYPE_2D) {
- glGenerateMipmap(GL_TEXTURE_2D);
- }
- } else {
- WARN("No image data provided");
- glTexImage2D(GL_TEXTURE_2D, 0, internal_format, desc.extents.x, desc.extents.y, 0, format,
- data_type, NULL);
- }
-
- glBindTexture(GL_TEXTURE_2D, 0);
-
- return handle;
-}
-
-GPU_Texture* GPU_TextureAlloc(TextureHandle* out_handle) {
- TextureHandle handle;
- GPU_Texture* texture = Texture_pool_alloc(&context.resource_pools->textures, &handle);
- DEBUG("Allocated texture with handle %d", handle.raw);
-
- GLuint gl_texture_id;
- glGenTextures(1, &gl_texture_id);
- texture->id = gl_texture_id;
-
- if (out_handle != NULL) {
- *out_handle = handle;
- }
-
- return texture;
-}
-
-void GPU_TextureDestroy(TextureHandle handle) { glDeleteTextures(1, &handle.raw); }
-
-// TODO: void GPU_TextureUpload(TextureHandle handle, size_t n_bytes, const void* data)
-
-void GPU_EncodeBindPipeline(GPU_CmdEncoder* encoder, GPU_Pipeline* pipeline) {
- encoder->pipeline = pipeline;
-
- // In OpenGL binding a pipeline is more or less equivalent to just setting the shader
- glUseProgram(pipeline->shader_id);
-
- if (pipeline->wireframe) {
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- } else {
- glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
- }
-}
-
-void GPU_EncodeBindShaderData(GPU_CmdEncoder* encoder, u32 group, ShaderDataLayout layout) {
- for (u32 binding_i = 0; binding_i < layout.binding_count; binding_i++) {
- ShaderBinding binding = layout.bindings[binding_i];
-
- switch (binding.kind) {
- case BINDING_BYTES: {
-#ifdef RAL_ASSERTS
- CASSERT_MSG(binding.data.bytes.data, "void* data pointer should be non null");
- CASSERT_MSG(binding.data.bytes.size > 0, "size should be greater than 0 bytes");
-#endif
- BufferHandle b;
- GPU_Buffer* ubo_buf;
- bool found = false;
- for (u32 i = 0; i < encoder->pipeline->uniform_count; i++) {
- b = encoder->pipeline->uniform_bindings[i];
- ubo_buf = BUFFER_GET(b);
- assert(ubo_buf->name != NULL);
- if (strcmp(ubo_buf->name, binding.label) == 0) {
- found = true;
- break;
- }
- }
- if (!found) {
- ERROR("Couldnt find uniform buffer object for %s!!", binding.label);
- break;
- }
-
- i32 blockIndex = glGetUniformBlockIndex(encoder->pipeline->shader_id, binding.label);
- if (blockIndex < 0) {
- WARN("Couldn't retrieve block index for uniform block '%s'", binding.label);
- break;
- }
-
- glBindBuffer(GL_UNIFORM_BUFFER, ubo_buf->id.ubo);
- glBufferSubData(GL_UNIFORM_BUFFER, 0, ubo_buf->size, binding.data.bytes.data);
- break;
- }
- case BINDING_TEXTURE: {
- GPU_Texture* tex = TEXTURE_GET(binding.data.texture.handle);
- GLint tex_slot = glGetUniformLocation(encoder->pipeline->shader_id, binding.label);
- if (tex_slot == GL_INVALID_VALUE || tex_slot < 0) {
- WARN("Invalid binding label for texture %s - couldn't fetch texture slot uniform",
- binding.label);
- }
- glUniform1i(tex_slot, binding_i);
- glActiveTexture(GL_TEXTURE0 + binding_i);
- glBindTexture(opengl_tex_type(tex->type), tex->id);
- break;
- }
- default:
- WARN("Unsupported binding kind");
- }
- }
-}
-
-void GPU_EncodeSetDefaults(GPU_CmdEncoder* encoder) {}
-
-void GPU_EncodeSetVertexBuffer(GPU_CmdEncoder* encoder, BufferHandle buf) {
- GPU_Buffer* buffer = BUFFER_GET(buf);
- if (buffer->vao == 0) { // if no VAO for this vertex buffer, create it
- INFO("Setting up VAO");
- buffer->vao = opengl_bindcreate_vao(buffer, encoder->pipeline->vertex_desc);
- }
- glBindVertexArray(buffer->vao);
-}
-void GPU_EncodeSetIndexBuffer(GPU_CmdEncoder* encoder, BufferHandle buf) {
- GPU_Buffer* buffer = BUFFER_GET(buf);
- glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer->id.ibo);
-}
-void GPU_EncodeDrawTris(GPU_CmdEncoder* encoder, u64 count) {
- glDrawArrays(GL_TRIANGLES, 0, count);
-}
-void GPU_EncodeDrawIndexedTris(GPU_CmdEncoder* encoder, u64 index_count) {
- glDrawElements(GL_TRIANGLES, index_count, GL_UNSIGNED_INT, 0);
-}
-
-PUB void GPU_EncodeDraw(GPU_CmdEncoder* encoder, PrimitiveTopology topology, u64 count) {
- glDrawArrays(opengl_prim_topology(topology), 0, count);
-}
-PUB void GPU_EncodeDrawIndexed(GPU_CmdEncoder* encoder, PrimitiveTopology topology,
- u64 index_count) {
- glDrawElements(opengl_prim_topology(topology), index_count, GL_UNSIGNED_INT, 0);
-}
-
-PUB void GPU_WriteTextureRegion(GPU_CmdEncoder* encoder, TextureHandle dst, u32 x_offset,
- u32 y_offset, u32 width, u32 height, const void* data) {
- CASSERT_MSG(data, "const void* data must not be NULL");
-
- GPU_Texture* tex = TEXTURE_GET(dst);
-
- glBindTexture(GL_TEXTURE_2D, tex->id);
- glTexSubImage2D(GL_TEXTURE_2D, 0, x_offset, y_offset, width, height, GL_RGBA, GL_UNSIGNED_BYTE,
- data);
-}
-
-bool GPU_Backend_BeginFrame() {
- glViewport(0, 0, context.swapchain.dimensions.x * 2, context.swapchain.dimensions.y * 2);
- glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- return true;
-}
-
-void GPU_Backend_EndFrame() { glfwSwapBuffers(context.window); }
-
-#endif