doxygen: add newline after \file
[blender.git] / source / blender / draw / intern / draw_manager_texture.c
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  * Copyright 2016, Blender Foundation.
17  */
18
19 /** \file
20  * \ingroup draw
21  */
22
23 #include "draw_manager.h"
24
25 #ifndef NDEBUG
26 /* Maybe gpu_texture.c is a better place for this. */
27 static bool drw_texture_format_supports_framebuffer(eGPUTextureFormat format)
28 {
29         /* Some formats do not work with framebuffers. */
30         switch (format) {
31                 /* Only add formats that are COMPATIBLE with FB.
32                  * Generally they are multiple of 16bit. */
33                 case GPU_R8:
34                 case GPU_R8UI:
35                 case GPU_R16F:
36                 case GPU_R16I:
37                 case GPU_R16UI:
38                 case GPU_R16:
39                 case GPU_R32F:
40                 case GPU_R32UI:
41                 case GPU_RG8:
42                 case GPU_RG16:
43                 case GPU_RG16F:
44                 case GPU_RG16I:
45                 case GPU_RG32F:
46                 case GPU_R11F_G11F_B10F:
47                 case GPU_RGBA8:
48                 case GPU_RGBA16F:
49                 case GPU_RGBA32F:
50                 case GPU_DEPTH_COMPONENT16:
51                 case GPU_DEPTH_COMPONENT24:
52                 case GPU_DEPTH24_STENCIL8:
53                 case GPU_DEPTH_COMPONENT32F:
54                         return true;
55                 default:
56                         return false;
57         }
58 }
59 #endif
60
61 void drw_texture_set_parameters(GPUTexture *tex, DRWTextureFlag flags)
62 {
63         GPU_texture_bind(tex, 0);
64         if (flags & DRW_TEX_MIPMAP) {
65                 GPU_texture_mipmap_mode(tex, true, flags & DRW_TEX_FILTER);
66                 GPU_texture_generate_mipmap(tex);
67         }
68         else {
69                 GPU_texture_filter_mode(tex, flags & DRW_TEX_FILTER);
70         }
71         GPU_texture_wrap_mode(tex, flags & DRW_TEX_WRAP);
72         GPU_texture_compare_mode(tex, flags & DRW_TEX_COMPARE);
73         GPU_texture_unbind(tex);
74 }
75
76 GPUTexture *DRW_texture_create_1D(int w, eGPUTextureFormat format, DRWTextureFlag flags, const float *fpixels)
77 {
78         GPUTexture *tex = GPU_texture_create_1D(w, format, fpixels, NULL);
79         drw_texture_set_parameters(tex, flags);
80
81         return tex;
82 }
83
84 GPUTexture *DRW_texture_create_2D(int w, int h, eGPUTextureFormat format, DRWTextureFlag flags, const float *fpixels)
85 {
86         GPUTexture *tex = GPU_texture_create_2D(w, h, format, fpixels, NULL);
87         drw_texture_set_parameters(tex, flags);
88
89         return tex;
90 }
91
92 GPUTexture *DRW_texture_create_2D_array(
93         int w, int h, int d, eGPUTextureFormat format, DRWTextureFlag flags, const float *fpixels)
94 {
95         GPUTexture *tex = GPU_texture_create_2D_array(w, h, d, format, fpixels, NULL);
96         drw_texture_set_parameters(tex, flags);
97
98         return tex;
99 }
100
101 GPUTexture *DRW_texture_create_3D(
102         int w, int h, int d, eGPUTextureFormat format, DRWTextureFlag flags, const float *fpixels)
103 {
104         GPUTexture *tex = GPU_texture_create_3D(w, h, d, format, fpixels, NULL);
105         drw_texture_set_parameters(tex, flags);
106
107         return tex;
108 }
109
110 GPUTexture *DRW_texture_create_cube(int w, eGPUTextureFormat format, DRWTextureFlag flags, const float *fpixels)
111 {
112         GPUTexture *tex = GPU_texture_create_cube(w, format, fpixels, NULL);
113         drw_texture_set_parameters(tex, flags);
114
115         return tex;
116 }
117
118 GPUTexture *DRW_texture_pool_query_2D(int w, int h, eGPUTextureFormat format, DrawEngineType *engine_type)
119 {
120         BLI_assert(drw_texture_format_supports_framebuffer(format));
121         GPUTexture *tex = GPU_viewport_texture_pool_query(DST.viewport, engine_type, w, h, format);
122
123         return tex;
124 }
125
126 void DRW_texture_ensure_fullscreen_2D(GPUTexture **tex, eGPUTextureFormat format, DRWTextureFlag flags)
127 {
128         if (*(tex) == NULL) {
129                 const float *size = DRW_viewport_size_get();
130                 *(tex) = DRW_texture_create_2D((int)size[0], (int)size[1], format, flags, NULL);
131         }
132 }
133
134 void DRW_texture_ensure_2D(GPUTexture **tex, int w, int h, eGPUTextureFormat format, DRWTextureFlag flags)
135 {
136         if (*(tex) == NULL) {
137                 *(tex) = DRW_texture_create_2D(w, h, format, flags, NULL);
138         }
139 }
140
141 void DRW_texture_generate_mipmaps(GPUTexture *tex)
142 {
143         GPU_texture_bind(tex, 0);
144         GPU_texture_generate_mipmap(tex);
145         GPU_texture_unbind(tex);
146 }
147
148 void DRW_texture_free(GPUTexture *tex)
149 {
150         GPU_texture_free(tex);
151 }