1 /*
2  * This software is licensed under the terms of the MIT License.
3  * See COPYING for further information.
4  * ---
5  * Copyright (c) 2011-2019, Lukas Weber <laochailan@web.de>.
6  * Copyright (c) 2012-2019, Andrei Alexeyev <akari@taisei-project.org>.
7  */
8 
9 #ifndef IGUARD_renderer_common_backend_h
10 #define IGUARD_renderer_common_backend_h
11 
12 #include "taisei.h"
13 
14 #include "../api.h"
15 
16 typedef struct RendererFuncs {
17 	void (*init)(void);
18 	void (*post_init)(void);
19 	void (*shutdown)(void);
20 
21 	SDL_Window* (*create_window)(const char *title, int x, int y, int w, int h, uint32_t flags);
22 
23 	r_feature_bits_t (*features)(void);
24 
25 	void (*capabilities)(r_capability_bits_t capbits);
26 	r_capability_bits_t (*capabilities_current)(void);
27 
28 	void (*draw)(VertexArray *varr, Primitive prim, uint firstvert, uint count, uint instances, uint base_instance);
29 	void (*draw_indexed)(VertexArray *varr, Primitive prim, uint firstidx, uint count, uint instances, uint base_instance);
30 
31 	void (*color4)(float r, float g, float b, float a);
32 	const Color* (*color_current)(void);
33 
34 	void (*blend)(BlendMode mode);
35 	BlendMode (*blend_current)(void);
36 
37 	void (*cull)(CullFaceMode mode);
38 	CullFaceMode (*cull_current)(void);
39 
40 	void (*depth_func)(DepthTestFunc depth_func);
41 	DepthTestFunc (*depth_func_current)(void);
42 
43 	bool (*shader_language_supported)(const ShaderLangInfo *lang, ShaderLangInfo *out_alternative);
44 
45 	ShaderObject* (*shader_object_compile)(ShaderSource *source);
46 	void (*shader_object_destroy)(ShaderObject *shobj);
47 	void (*shader_object_set_debug_label)(ShaderObject *shobj, const char *label);
48 	const char* (*shader_object_get_debug_label)(ShaderObject *shobj);
49 
50 	ShaderProgram* (*shader_program_link)(uint num_objects, ShaderObject *shobjs[num_objects]);
51 	void (*shader_program_destroy)(ShaderProgram *prog);
52 	void (*shader_program_set_debug_label)(ShaderProgram *prog, const char *label);
53 	const char* (*shader_program_get_debug_label)(ShaderProgram *prog);
54 
55 	void (*shader)(ShaderProgram *prog);
56 	ShaderProgram* (*shader_current)(void);
57 
58 	Uniform* (*shader_uniform)(ShaderProgram *prog, const char *uniform_name, hash_t uniform_name_hash);
59 	void (*uniform)(Uniform *uniform, uint offset, uint count, const void *data);
60 	UniformType (*uniform_type)(Uniform *uniform);
61 
62 	Texture* (*texture_create)(const TextureParams *params);
63 	void (*texture_get_params)(Texture *tex, TextureParams *params);
64 	void (*texture_get_size)(Texture *tex, uint mipmap, uint *width, uint *height);
65 	const char* (*texture_get_debug_label)(Texture *tex);
66 	void (*texture_set_debug_label)(Texture *tex, const char *label);
67 	void (*texture_set_filter)(Texture *tex, TextureFilterMode fmin, TextureFilterMode fmag);
68 	void (*texture_set_wrap)(Texture *tex, TextureWrapMode ws, TextureWrapMode wt);
69 	void (*texture_destroy)(Texture *tex);
70 	void (*texture_invalidate)(Texture *tex);
71 	void (*texture_fill)(Texture *tex, uint mipmap, const Pixmap *image_data);
72 	void (*texture_fill_region)(Texture *tex, uint mipmap, uint x, uint y, const Pixmap *image_data);
73 	void (*texture_clear)(Texture *tex, const Color *clr);
74 
75 	Framebuffer* (*framebuffer_create)(void);
76 	const char* (*framebuffer_get_debug_label)(Framebuffer *framebuffer);
77 	void (*framebuffer_set_debug_label)(Framebuffer *framebuffer, const char *label);
78 	void (*framebuffer_destroy)(Framebuffer *framebuffer);
79 	void (*framebuffer_attach)(Framebuffer *framebuffer, Texture *tex, uint mipmap, FramebufferAttachment attachment);
80 	void (*framebuffer_viewport)(Framebuffer *framebuffer, FloatRect vp);
81 	void (*framebuffer_viewport_current)(Framebuffer *framebuffer, FloatRect *vp);
82 	Texture* (*framebuffer_get_attachment)(Framebuffer *framebuffer, FramebufferAttachment attachment);
83 	uint (*framebuffer_get_attachment_mipmap)(Framebuffer *framebuffer, FramebufferAttachment attachment);
84 	void (*framebuffer_clear)(Framebuffer *framebuffer, ClearBufferFlags flags, const Color *colorval, float depthval);
85 	IntExtent (*framebuffer_get_size)(Framebuffer *framebuffer);
86 
87 	void (*framebuffer)(Framebuffer *framebuffer);
88 	Framebuffer* (*framebuffer_current)(void);
89 
90 	VertexBuffer* (*vertex_buffer_create)(size_t capacity, void *data);
91 	const char* (*vertex_buffer_get_debug_label)(VertexBuffer *vbuf);
92 	void (*vertex_buffer_set_debug_label)(VertexBuffer *vbuf, const char *label);
93 	void (*vertex_buffer_destroy)(VertexBuffer *vbuf);
94 	void (*vertex_buffer_invalidate)(VertexBuffer *vbuf);
95 	SDL_RWops* (*vertex_buffer_get_stream)(VertexBuffer *vbuf);
96 
97 	IndexBuffer* (*index_buffer_create)(size_t max_elements);
98 	size_t (*index_buffer_get_capacity)(IndexBuffer *ibuf);
99 	const char* (*index_buffer_get_debug_label)(IndexBuffer *ibuf);
100 	void (*index_buffer_set_debug_label)(IndexBuffer *ibuf, const char *label);
101 	void (*index_buffer_set_offset)(IndexBuffer *ibuf, size_t offset);
102 	size_t (*index_buffer_get_offset)(IndexBuffer *ibuf);
103 	void (*index_buffer_add_indices)(IndexBuffer *ibuf, uint index_ofs, size_t num_indices, uint indices[num_indices]);
104 	void (*index_buffer_destroy)(IndexBuffer *ibuf);
105 
106 	VertexArray* (*vertex_array_create)(void);
107 	const char* (*vertex_array_get_debug_label)(VertexArray *varr);
108 	void (*vertex_array_set_debug_label)(VertexArray *varr, const char *label);
109 	void (*vertex_array_destroy)(VertexArray *varr);
110 	void (*vertex_array_layout)(VertexArray *varr, uint nattribs, VertexAttribFormat attribs[nattribs]);
111 	void (*vertex_array_attach_vertex_buffer)(VertexArray *varr, VertexBuffer *vbuf, uint attachment);
112 	void (*vertex_array_attach_index_buffer)(VertexArray *varr, IndexBuffer *ibuf);
113 	VertexBuffer* (*vertex_array_get_vertex_attachment)(VertexArray *varr, uint attachment);
114 	IndexBuffer* (*vertex_array_get_index_attachment)(VertexArray *varr);
115 
116 	void (*vsync)(VsyncMode mode);
117 	VsyncMode (*vsync_current)(void);
118 
119 	void (*swap)(SDL_Window *window);
120 
121 	bool (*screenshot)(Pixmap *dst);
122 } RendererFuncs;
123 
124 typedef struct RendererBackend {
125 	const char *name;
126 	RendererFuncs funcs;
127 	void *custom;
128 } RendererBackend;
129 
130 extern RendererBackend *_r_backends[];
131 extern RendererBackend _r_backend;
132 
133 void _r_backend_init(void);
134 void _r_backend_inherit(RendererBackend *dest, const RendererBackend *base);
135 
136 #endif // IGUARD_renderer_common_backend_h
137