summaryrefslogtreecommitdiff
path: root/core/renderer
diff options
context:
space:
mode:
Diffstat (limited to 'core/renderer')
-rw-r--r--core/renderer/gles3.c92
1 files changed, 92 insertions, 0 deletions
diff --git a/core/renderer/gles3.c b/core/renderer/gles3.c
new file mode 100644
index 0000000..5dd1538
--- /dev/null
+++ b/core/renderer/gles3.c
@@ -0,0 +1,92 @@
+#include "core/renderer.h"
+#include "core/window.h"
+#include "internal/utils.h"
+
+#include <GLES2/gl2.h>
+#include <GLES3/gl3.h>
+#include <stddef.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+GLuint load_shader(const char *code, uint type) {
+ int success;
+ char infoLog[512];
+ GLuint shader = glCreateShader(type);
+
+ glShaderSource(shader, 1, &code, NULL);
+ glCompileShader(shader);
+ glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
+
+ if (!success) {
+ glGetShaderInfoLog(shader, 512, NULL, infoLog);
+ printf("Shader compilation failed: %s\n", infoLog);
+ }
+
+ return shader;
+}
+
+struct ruim_rendererGLES RuimSetupGLES(void) {
+ int success;
+ char infoLog[512];
+ struct ruim_rendererGLES renderer;
+ float vertices[] = {-0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 0.5f, 0.0f};
+
+ GLuint vertexShdr =
+ load_shader("#version 300 es\n"
+ "layout (location = 0) in vec3 aPos;\n"
+ "void main()\n"
+ "{\n"
+ "gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
+ "}\0",
+ GL_VERTEX_SHADER);
+
+ GLuint fragmentShdr = load_shader("#version 300 es\n"
+ "precision mediump float;\n"
+ "out vec4 FragColor;\n"
+ "void main()\n"
+ "{\n"
+ "FragColor = vec4(1.0, 0.5, 0.2, 1.0);\n"
+ "}\0",
+ GL_FRAGMENT_SHADER);
+
+ glGenBuffers(1, &renderer.VBO);
+ glGenVertexArrays(1, &renderer.VAO);
+
+ renderer.shaderProgram = glCreateProgram();
+ glAttachShader(renderer.shaderProgram, vertexShdr);
+ glAttachShader(renderer.shaderProgram, fragmentShdr);
+ glLinkProgram(renderer.shaderProgram);
+ glGetProgramiv(renderer.shaderProgram, GL_LINK_STATUS, &success);
+ if (!success) {
+ glGetProgramInfoLog(renderer.shaderProgram, 512, NULL, infoLog);
+ printf("Program linking failed: %s\n", infoLog);
+ }
+
+ glDeleteShader(vertexShdr);
+ glDeleteShader(fragmentShdr);
+
+ glBindVertexArray(renderer.VAO);
+
+ glBindBuffer(GL_ARRAY_BUFFER, renderer.VBO);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
+
+ glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void *)0);
+ glEnableVertexAttribArray(0);
+
+ glBindVertexArray(0);
+
+ return renderer;
+}
+
+void RuimResizeGLES(struct ruim_rendererGLES *renderer, int width, int height) {
+ glViewport(0, 0, width, height);
+}
+
+void RuimRenderGLES(struct ruim_rendererGLES *renderer) {
+ glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
+ glClear(GL_COLOR_BUFFER_BIT);
+
+ glUseProgram(renderer->shaderProgram);
+ glBindVertexArray(renderer->VAO);
+ glDrawArrays(GL_TRIANGLES, 0, 3);
+}