Merge branch 'master' into blender2.8
[blender.git] / source / blender / gpu / GPU_viewport.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2005 Blender Foundation.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s):
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file GPU_viewport.h
29  *  \ingroup gpu
30  */
31
32 #ifndef __GPU_VIEWPORT_H__
33 #define __GPU_VIEWPORT_H__
34
35 #include <stdbool.h>
36
37 #include "DNA_vec_types.h"
38
39 #include "GPU_framebuffer.h"
40 #include "GPU_texture.h"
41
42 #define GPU_INFO_SIZE 512 /* IMA_MAX_RENDER_TEXT */
43
44 typedef struct GPUViewport GPUViewport;
45
46 /* Contains memory pools informations */
47 typedef struct ViewportMemoryPool {
48         struct BLI_mempool *calls;
49         struct BLI_mempool *states;
50         struct BLI_mempool *shgroups;
51         struct BLI_mempool *uniforms;
52         struct BLI_mempool *passes;
53 } ViewportMemoryPool;
54
55 /* All FramebufferLists are just the same pointers with different names */
56 typedef struct FramebufferList {
57         struct GPUFrameBuffer *framebuffers[0];
58 } FramebufferList;
59
60 typedef struct TextureList {
61         struct GPUTexture *textures[0];
62 } TextureList;
63
64 typedef struct PassList {
65         struct DRWPass *passes[0];
66 } PassList;
67
68 typedef struct StorageList {
69         void *storage[0]; /* custom structs from the engine */
70 } StorageList;
71
72 typedef struct ViewportEngineData {
73         void *engine_type;
74
75         FramebufferList *fbl;
76         TextureList *txl;
77         PassList *psl;
78         StorageList *stl;
79         char info[GPU_INFO_SIZE];
80
81         /* we may want to put this elsewhere */
82         struct DRWTextStore *text_draw_cache;
83
84         /* Profiling data */
85         double init_time;
86         double render_time;
87         double background_time;
88 } ViewportEngineData;
89
90 typedef struct ViewportEngineData_Info {
91         int fbl_len;
92         int txl_len;
93         int psl_len;
94         int stl_len;
95 } ViewportEngineData_Info;
96
97 GPUViewport *GPU_viewport_create(void);
98 void GPU_viewport_bind(GPUViewport *viewport, const rcti *rect);
99 void GPU_viewport_unbind(GPUViewport *viewport);
100 void GPU_viewport_draw_to_screen(GPUViewport *viewport, const rcti *rect);
101 void GPU_viewport_free(GPUViewport *viewport);
102
103 GPUViewport *GPU_viewport_create_from_offscreen(struct GPUOffScreen *ofs);
104 void GPU_viewport_clear_from_offscreen(GPUViewport *viewport);
105
106 ViewportMemoryPool *GPU_viewport_mempool_get(GPUViewport *viewport);
107 struct DRWInstanceDataList *GPU_viewport_instance_data_list_get(GPUViewport *viewport);
108
109 void *GPU_viewport_engine_data_create(GPUViewport *viewport, void *engine_type);
110 void *GPU_viewport_engine_data_get(GPUViewport *viewport, void *engine_type);
111 void *GPU_viewport_framebuffer_list_get(GPUViewport *viewport);
112 void *GPU_viewport_texture_list_get(GPUViewport *viewport);
113 void  GPU_viewport_size_get(const GPUViewport *viewport, int size[2]);
114 void  GPU_viewport_size_set(GPUViewport *viewport, const int size[2]);
115
116 /* Profiling */
117 double *GPU_viewport_cache_time_get(GPUViewport *viewport);
118
119 void GPU_viewport_tag_update(GPUViewport *viewport);
120 bool GPU_viewport_do_update(GPUViewport *viewport);
121
122 GPUTexture *GPU_viewport_color_texture(GPUViewport *viewport);
123
124 /* Texture pool */
125 GPUTexture *GPU_viewport_texture_pool_query(GPUViewport *viewport, void *engine, int width, int height, int format);
126
127 bool GPU_viewport_engines_data_validate(GPUViewport *viewport, unsigned int hash);
128 void GPU_viewport_cache_release(GPUViewport *viewport);
129
130 #endif // __GPU_VIEWPORT_H__