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