diff options
author | omniscient <17525998+omnisci3nce@users.noreply.github.com> | 2024-10-05 12:48:05 +1000 |
---|---|---|
committer | omniscient <17525998+omnisci3nce@users.noreply.github.com> | 2024-10-05 12:48:05 +1000 |
commit | dfb6adbcbcc7d50b770b6d5ea82efdd8f8c32e25 (patch) | |
tree | a470b91a90716d7ea46fde53ed395449c24583a2 /src/ral/backends/opengl | |
parent | 54354e32c6498cc7f8839ab4deb1208d37216cc5 (diff) |
delete documentation workflow
Diffstat (limited to 'src/ral/backends/opengl')
-rw-r--r-- | src/ral/backends/opengl/backend_opengl.c | 449 | ||||
-rw-r--r-- | src/ral/backends/opengl/backend_opengl.h | 109 | ||||
-rw-r--r-- | src/ral/backends/opengl/opengl_helpers.h | 159 |
3 files changed, 0 insertions, 717 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 diff --git a/src/ral/backends/opengl/backend_opengl.h b/src/ral/backends/opengl/backend_opengl.h deleted file mode 100644 index 7bd1b81..0000000 --- a/src/ral/backends/opengl/backend_opengl.h +++ /dev/null @@ -1,109 +0,0 @@ -#pragma once -#include "defines.h" - -#if defined(CEL_REND_BACKEND_OPENGL) - -#include "maths_types.h" -#include "ral_impl.h" -#include "ral_types.h" - -#define MAX_PIPELINE_UNIFORM_BUFFERS 32 - -#define OPENGL_DEFAULT_FRAMEBUFFER 0 - -typedef struct GPU_Swapchain { - u32x2 dimensions; -} GPU_Swapchain; - -typedef struct GPU_Device { - u32 pad; -} GPU_Device; - -typedef struct GPU_PipelineLayout { - void* pad; -} GPU_PipelineLayout; - -typedef struct GPU_Pipeline { - u32 shader_id; - GPU_Renderpass* renderpass; - VertexDescription vertex_desc; - BufferHandle uniform_bindings[MAX_PIPELINE_UNIFORM_BUFFERS]; - u32 uniform_count; - bool wireframe; -} GPU_Pipeline; - -typedef struct GPU_Renderpass { - u32 fbo; - GPU_RenderpassDesc description; -} GPU_Renderpass; - -typedef struct GPU_CmdEncoder { - GPU_Pipeline* pipeline; -} GPU_CmdEncoder; // Recording - -typedef struct GPU_CmdBuffer { - void* pad; -} GPU_CmdBuffer; // Ready for submission - -typedef struct GPU_Buffer { - union { - u32 vbo; - u32 ibo; - u32 ubo; - } id; - union { - u32 vao; - u32 ubo_binding_point; - }; // Optional - char* name; - u64 size; -} GPU_Buffer; - -typedef struct GPU_Texture { - u32 id; - GPU_TextureType type; -} GPU_Texture; - -typedef struct opengl_support { - u32 pad; -} opengl_support; - -void uniform_vec3f(u32 program_id, const char* uniform_name, Vec3* value); -void uniform_f32(u32 program_id, const char* uniform_name, f32 value); -void uniform_i32(u32 program_id, const char* uniform_name, i32 value); -void uniform_mat4f(u32 program_id, const char* uniform_name, Mat4* value); - -typedef enum GlCommandType { - GLCMD_DRAW, - GLCMD_DRAW_INDEXED, - GLCMD_BIND_VBUF, - GLCMD_BIND_IBUF, - GLCMD_SET_PROGRAM, -} GlCommandType; - -typedef struct GlCommand { - GlCommandType cmd_type; - union { - struct { - PrimitiveTopology topology; - u32 start_vertex; - u32 vertex_count; - // TODO: instance - } draw; - struct { - PrimitiveTopology topology; - u32 index_count; - } draw_indexed; - struct { - u32 buffer_id; - } bind_vbuf; - struct { - u32 buffer_id; - } bind_ibuf; - struct { - u32 program_id; - } set_program; - } data; -} GlCommand; - -#endif diff --git a/src/ral/backends/opengl/opengl_helpers.h b/src/ral/backends/opengl/opengl_helpers.h deleted file mode 100644 index 706e2a0..0000000 --- a/src/ral/backends/opengl/opengl_helpers.h +++ /dev/null @@ -1,159 +0,0 @@ -#pragma once -#include "defines.h" -#include "ral_common.h" -#include "ral_impl.h" -#if defined(CEL_REND_BACKEND_OPENGL) -#include "backend_opengl.h" -#include "file.h" -#include "log.h" -#include "ral_types.h" - -#include <glad/glad.h> -#include <glfw3.h> -#include "ral_types.h" - -typedef struct opengl_vertex_attr { - u32 count; - GLenum data_type; -} opengl_vertex_attr; - -static opengl_vertex_attr format_from_vertex_attr(VertexAttribType attr) { - switch (attr) { - case ATTR_F32: - return (opengl_vertex_attr){ .count = 1, .data_type = GL_FLOAT }; - case ATTR_U32: - return (opengl_vertex_attr){ .count = 1, .data_type = GL_UNSIGNED_INT }; - case ATTR_I32: - return (opengl_vertex_attr){ .count = 1, .data_type = GL_INT }; - case ATTR_F32x2: - return (opengl_vertex_attr){ .count = 2, .data_type = GL_FLOAT }; - case ATTR_U32x2: - // return VK_FORMAT_R32G32_UINT; - case ATTR_I32x2: - // return VK_FORMAT_R32G32_UINT; - case ATTR_F32x3: - return (opengl_vertex_attr){ .count = 3, .data_type = GL_FLOAT }; - case ATTR_U32x3: - // return VK_FORMAT_R32G32B32_UINT; - case ATTR_I32x3: - // return VK_FORMAT_R32G32B32_SINT; - case ATTR_F32x4: - return (opengl_vertex_attr){ .count = 4, .data_type = GL_FLOAT }; - case ATTR_U32x4: - // return VK_FORMAT_R32G32B32A32_UINT; - case ATTR_I32x4: - return (opengl_vertex_attr){ .count = 4, .data_type = GL_INT }; - } -} - -static u32 opengl_bindcreate_vao(GPU_Buffer* buf, VertexDescription desc) { - DEBUG("Vertex format name %s", desc.debug_label); - // 1. Bind the buffer - glBindBuffer(GL_ARRAY_BUFFER, buf->id.vbo); - // 2. Create new VAO - u32 vao; - glGenVertexArrays(1, &vao); - glBindVertexArray(vao); - - // Attributes - u32 attr_count = desc.attributes_count; - // printf("N attributes %d\n", attr_count); - u64 offset = 0; - size_t vertex_size = desc.use_full_vertex_size ? sizeof(Vertex) : VertexDesc_CalcStride(&desc); - for (u32 i = 0; i < desc.attributes_count; i++) { - opengl_vertex_attr format = format_from_vertex_attr(desc.attributes[i]); - glVertexAttribPointer(i, format.count, format.data_type, GL_FALSE, vertex_size, (void*)offset); - TRACE(" %d %d %d %d %d %s", i, format.count, format.data_type, vertex_size, offset, - desc.attr_names[i]); - glEnableVertexAttribArray(i); // nth index - size_t this_offset = VertexAttribSize(desc.attributes[i]); - // printf("offset total %lld this attr %zu\n", offset, this_offset); - offset += this_offset; - } - glBindBuffer(GL_ARRAY_BUFFER, 0); - - return vao; -} - -static u32 shader_create_separate(const char* vert_shader, const char* frag_shader) { - INFO("Load shaders at %s and %s", vert_shader, frag_shader); - int success; - char info_log[512]; - - u32 vertex = glCreateShader(GL_VERTEX_SHADER); - const char* vertex_shader_src = string_from_file(vert_shader); - if (vertex_shader_src == NULL) { - ERROR("EXIT: couldnt load shader"); - exit(-1); - } - glShaderSource(vertex, 1, &vertex_shader_src, NULL); - glCompileShader(vertex); - glGetShaderiv(vertex, GL_COMPILE_STATUS, &success); - if (!success) { - glGetShaderInfoLog(vertex, 512, NULL, info_log); - printf("%s\n", info_log); - ERROR("EXIT: vertex shader compilation failed"); - exit(-1); - } - - // fragment shader - u32 fragment = glCreateShader(GL_FRAGMENT_SHADER); - const char* fragment_shader_src = string_from_file(frag_shader); - if (fragment_shader_src == NULL) { - ERROR("EXIT: couldnt load shader"); - exit(-1); - } - glShaderSource(fragment, 1, &fragment_shader_src, NULL); - glCompileShader(fragment); - glGetShaderiv(fragment, GL_COMPILE_STATUS, &success); - if (!success) { - glGetShaderInfoLog(fragment, 512, NULL, info_log); - printf("%s\n", info_log); - ERROR("EXIT: fragment shader compilation failed"); - exit(-1); - } - - u32 shader_prog; - shader_prog = glCreateProgram(); - - glAttachShader(shader_prog, vertex); - glAttachShader(shader_prog, fragment); - glLinkProgram(shader_prog); - glDeleteShader(vertex); - glDeleteShader(fragment); - free((char*)vertex_shader_src); - free((char*)fragment_shader_src); - - return shader_prog; -} - -static GLenum opengl_tex_type(GPU_TextureType tex_type) { - switch (tex_type) { - case TEXTURE_TYPE_2D: - return GL_TEXTURE_2D; - case TEXTURE_TYPE_CUBE_MAP: - return GL_TEXTURE_CUBE_MAP; - default: - return GL_TEXTURE_2D; - } -} - -static GLenum opengl_prim_topology(PrimitiveTopology t) { - switch (t) { - case CEL_POINT: - return GL_POINT; - case CEL_LINE: - return GL_LINES; - case CEL_LINE_STRIP: - return GL_LINE_STRIP; - case CEL_TRI: - return GL_TRIANGLES; - case CEL_TRI_STRIP: - return GL_TRIANGLE_STRIP; - case PRIMITIVE_TOPOLOGY_COUNT: - WARN("Invalid PrimitiveTopology value"); - break; - } -} - -#endif |