aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2017-06-08 15:52:42 -0400
committerDrew DeVault <sir@cmpwn.com>2017-06-08 15:52:42 -0400
commitcd6a40d81679c37795e9d24354a8bbbf84cd53a6 (patch)
tree82186fb0985a16ed76928b0226ff2eed9bb2c261 /include
parent83f8864f0ab1722aae12cc744094a7424c41f2d8 (diff)
Further improvements to rendering subsystem
Diffstat (limited to 'include')
-rw-r--r--include/render.h29
-rw-r--r--include/render/gles3.h18
-rw-r--r--include/wlr/render.h84
-rw-r--r--include/wlr/render/gles3.h7
-rw-r--r--include/wlr/render/interface.h43
-rw-r--r--include/wlr/render/matrix.h2
6 files changed, 133 insertions, 50 deletions
diff --git a/include/render.h b/include/render.h
deleted file mode 100644
index 0f977eb0..00000000
--- a/include/render.h
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef _WLR_RENDER_INTERNAL_H
-#define _WLR_RENDER_INTERNAL_H
-#include <stdint.h>
-#include <wlr/render.h>
-#include <wayland-util.h>
-#include <GLES3/gl3.h>
-#include <stdbool.h>
-
-struct wlr_surface {
- bool valid;
- GLuint tex_id;
- uint32_t format;
- int width, height;
-};
-
-struct wlr_shader {
- bool valid;
- uint32_t format;
- GLuint vert;
- GLuint program;
- struct wlr_shader *next;
-};
-
-struct wlr_renderer {
- struct wlr_shader *shader;
- // TODO: EGL stuff
-};
-
-#endif
diff --git a/include/render/gles3.h b/include/render/gles3.h
new file mode 100644
index 00000000..91b738a6
--- /dev/null
+++ b/include/render/gles3.h
@@ -0,0 +1,18 @@
+#ifndef _WLR_RENDER_GLES2_INTERNAL_H
+#define _WLR_RENDER_GLES2_INTERNAL_H
+#include <stdint.h>
+#include <GLES3/gl3.h>
+#include <wlr/render.h>
+
+struct wlr_surface_state {
+ struct wlr_surface *wlr_surface;
+ GLuint tex_id;
+};
+
+struct wlr_surface *gles3_surface_init();
+
+extern const GLchar vertex_src[];
+extern const GLchar fragment_src_RGB[];
+extern const GLchar fragment_src_RGBA[];
+
+#endif
diff --git a/include/wlr/render.h b/include/wlr/render.h
index 3335b3d5..88aa615e 100644
--- a/include/wlr/render.h
+++ b/include/wlr/render.h
@@ -2,30 +2,74 @@
#define _WLR_RENDER_H
#include <stdint.h>
#include <wayland-server-protocol.h>
+#include <wlr/types.h>
struct wlr_surface;
-struct wlr_surface *wlr_surface_init();
-void wlr_surface_attach_pixels(struct wlr_surface *surf, uint32_t format,
+struct wlr_renderer;
+
+void wlr_renderer_begin(struct wlr_renderer *r, struct wlr_output *output);
+void wlr_renderer_end(struct wlr_renderer *r);
+/**
+ * Requests a surface handle from this renderer.
+ */
+struct wlr_surface *wlr_render_surface_init(struct wlr_renderer *r);
+/**
+ * Renders the requested surface using the provided matrix. A typical surface
+ * rendering goes like so:
+ *
+ * struct wlr_renderer *renderer;
+ * struct wlr_surface *surface;
+ * float projection[16];
+ * float matrix[16];
+ * wlr_surface_get_matrix(surface, &matrix, &projection, 123, 321);
+ * wlr_render_with_matrix(renderer, surface, &matrix);
+ *
+ * This will render the surface at <123, 321>.
+ */
+bool wlr_render_with_matrix(struct wlr_renderer *r,
+ struct wlr_surface *surface, const float (*matrix)[16]);
+/**
+ * Destroys this wlr_renderer. Surfaces must be destroyed separately.
+ */
+void wlr_renderer_destroy(struct wlr_renderer *renderer);
+
+struct wlr_surface_impl;
+struct wlr_surface_state;
+
+struct wlr_surface {
+ struct wlr_surface_impl *impl;
+ struct wlr_surface_state *state;
+ bool valid;
+ uint32_t format;
+ int width, height;
+};
+
+/**
+ * Attaches a pixel buffer to this surface. The buffer may be discarded after
+ * calling this function.
+ */
+bool wlr_surface_attach_pixels(struct wlr_surface *surf, uint32_t format,
int width, int height, const unsigned char *pixels);
-void wlr_surface_attach_shm(struct wlr_surface *surf, uint32_t format,
+/**
+ * Attaches pixels from a wl_shm_buffer to this surface. The shm buffer may be
+ * invalidated after calling this function.
+ */
+bool wlr_surface_attach_shm(struct wlr_surface *surf, uint32_t format,
struct wl_shm_buffer *shm);
-// TODO: EGL
+/**
+ * Prepares a matrix with the appropriate scale for the given surface and
+ * multiplies it with the projection, producing a matrix that the shader can
+ * muptlipy vertex coordinates with to get final screen coordinates.
+ *
+ * The projection matrix is assumed to be an orthographic projection of [0,
+ * width) and [0, height], and the x and y coordinates provided are used as
+ * such.
+ */
+void wlr_surface_get_matrix(struct wlr_surface *surface,
+ float (*matrix)[16], const float (*projection)[16], int x, int y);
+/**
+ * Destroys this wlr_surface.
+ */
void wlr_surface_destroy(struct wlr_surface *tex);
-struct wlr_shader;
-struct wlr_shader *wlr_shader_init(const char *vertex);
-bool wlr_shader_add_format(struct wlr_shader *shader, uint32_t format,
- const char *frag);
-bool wlr_shader_use(struct wlr_shader *shader, uint32_t format);
-void wlr_shader_destroy(struct wlr_shader *shader);
-
-struct wlr_renderer;
-struct wlr_renderer *wlr_renderer_init();
-void wlr_renderer_set_shader(struct wlr_renderer *renderer,
- struct wlr_shader *shader);
-bool wlr_render_quad(struct wlr_renderer *renderer,
- struct wlr_surface *surf, float (*transform)[16],
- float x, float y);
-void wlr_renderer_destroy(struct wlr_renderer *renderer);
-
#endif
diff --git a/include/wlr/render/gles3.h b/include/wlr/render/gles3.h
new file mode 100644
index 00000000..7b60bb97
--- /dev/null
+++ b/include/wlr/render/gles3.h
@@ -0,0 +1,7 @@
+#ifndef _WLR_GLES3_RENDERER_H
+#define _WLR_GLES3_RENDERER_H
+#include <wlr/render.h>
+
+struct wlr_renderer *wlr_gles3_renderer_init();
+
+#endif
diff --git a/include/wlr/render/interface.h b/include/wlr/render/interface.h
new file mode 100644
index 00000000..80471ac8
--- /dev/null
+++ b/include/wlr/render/interface.h
@@ -0,0 +1,43 @@
+#ifndef _WLR_RENDER_INTERFACE_H
+#define _WLR_RENDER_INTERFACE_H
+#include <wayland-server-protocol.h>
+#include <stdbool.h>
+#include <wlr/render.h>
+#include <wlr/types.h>
+
+struct wlr_renderer_impl;
+struct wlr_renderer_state;
+
+struct wlr_renderer {
+ struct wlr_renderer_impl *impl;
+ struct wlr_renderer_state *state;
+};
+
+struct wlr_renderer_impl {
+ void (*begin)(struct wlr_renderer_state *state, struct wlr_output *output);
+ void (*end)(struct wlr_renderer_state *state);
+ struct wlr_surface *(*surface_init)(struct wlr_renderer_state *state);
+ bool (*render_with_matrix)(struct wlr_renderer_state *state,
+ struct wlr_surface *surface, const float (*matrix)[16]);
+ void (*destroy)(struct wlr_renderer_state *state);
+};
+
+struct wlr_renderer *wlr_renderer_init(struct wlr_renderer_state *state,
+ struct wlr_renderer_impl *impl);
+
+struct wlr_surface_impl {
+ bool (*attach_pixels)(struct wlr_surface_state *state, uint32_t format,
+ int width, int height, const unsigned char *pixels);
+ bool (*attach_shm)(struct wlr_surface_state *state, uint32_t format,
+ struct wl_shm_buffer *shm);
+ // TODO: egl
+ void (*get_matrix)(struct wlr_surface_state *state,
+ float (*matrix)[16], const float (*projection)[16], int x, int y);
+ void (*bind)(struct wlr_surface_state *state);
+ void (*destroy)(struct wlr_surface_state *state);
+};
+
+struct wlr_surface *wlr_surface_init();
+void wlr_surface_bind(struct wlr_surface *surface);
+
+#endif
diff --git a/include/wlr/render/matrix.h b/include/wlr/render/matrix.h
index a1053b00..954207da 100644
--- a/include/wlr/render/matrix.h
+++ b/include/wlr/render/matrix.h
@@ -5,6 +5,6 @@ void wlr_matrix_identity(float (*output)[16]);
void wlr_matrix_translate(float (*output)[16], float x, float y, float z);
void wlr_matrix_scale(float (*output)[16], float x, float y, float z);
void wlr_matrix_rotate(float (*output)[16], float radians);
-void wlr_matrix_mul(float (*x)[16], float (*y)[16], float (*product)[16]);
+void wlr_matrix_mul(const float (*x)[16], const float (*y)[16], float (*product)[16]);
#endif