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