Blender V5.0
gpu_viewport.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2006 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
10
11#include <cstring>
12
13#include "BLI_math_vector.h"
15#include "BLI_rect.h"
16
17#include "BKE_colortools.hh"
18
19#include "DNA_color_types.h"
21
22#include "DNA_vec_types.h"
23
24#include "GPU_capabilities.hh"
25#include "GPU_framebuffer.hh"
26#include "GPU_immediate.hh"
27#include "GPU_matrix.hh"
28#include "GPU_state.hh"
29#include "GPU_texture.hh"
30#include "GPU_viewport.hh"
31
32#include "DRW_engine.hh"
33
34#include "MEM_guardedalloc.h"
35
36/* Struct storing a viewport specific blender::gpu::Batch.
37 * The end-goal is to have a single batch shared across viewport and use a model matrix to place
38 * the batch. Due to OCIO and Image/UV editor we are not able to use an model matrix yet. */
40 blender::gpu::Batch *batch;
41 struct {
45};
46
47static struct {
49 struct {
52} g_viewport = {{0}};
53
56 int flag;
57
58 /* Set the active view (for stereoscopic viewport rendering). */
60
61 /* Viewport Resources. */
77
78 /* Color management. */
83 float dither;
84 /* TODO(@fclem): the UV-image display use the viewport but do not set any view transform for the
85 * moment. The end goal would be to let the GPUViewport do the color management. */
88};
89
90enum {
91 DO_UPDATE = (1 << 0),
93};
94
96{
97 viewport->flag |= DO_UPDATE;
98}
99
101{
102 bool ret = (viewport->flag & DO_UPDATE);
103 viewport->flag &= ~DO_UPDATE;
104 return ret;
105}
106
108{
109 GPUViewport *viewport = MEM_callocN<GPUViewport>("GPUViewport");
110 viewport->do_color_management = false;
111 viewport->size[0] = viewport->size[1] = -1;
112 viewport->active_view = 0;
113 return viewport;
114}
115
117{
118 GPUViewport *viewport = GPU_viewport_create();
119 viewport->flag = GPU_VIEWPORT_STEREO;
120 return viewport;
121}
122
124{
125 return &viewport->draw_data;
126}
127
129{
130 int *size = viewport->size;
131 float const empty_pixel[4] = {0.0f, 0.0f, 0.0f, 0.0f};
133
134 if (viewport->color_render_tx[0] == nullptr) {
135
136 /* NOTE: dtxl_color texture requires write support as it may be written to by the viewport
137 * compositor. */
139 "dtxl_color",
140 UNPACK2(size),
141 1,
142 blender::gpu::TextureFormat::SFLOAT_16_16_16_16,
144 nullptr);
146 "dtxl_color_overlay",
147 UNPACK2(size),
148 1,
149 blender::gpu::TextureFormat::SRGBA_8_8_8_8,
150 usage,
151 nullptr);
152
153 GPU_texture_clear(viewport->color_render_tx[0], GPU_DATA_FLOAT, empty_pixel);
154 GPU_texture_clear(viewport->color_overlay_tx[0], GPU_DATA_FLOAT, empty_pixel);
155 }
156
157 if ((viewport->flag & GPU_VIEWPORT_STEREO) != 0 && viewport->color_render_tx[1] == nullptr) {
159 "dtxl_color_stereo",
160 UNPACK2(size),
161 1,
162 blender::gpu::TextureFormat::SFLOAT_16_16_16_16,
164 nullptr);
166 "dtxl_color_overlay_stereo",
167 UNPACK2(size),
168 1,
169 blender::gpu::TextureFormat::SRGBA_8_8_8_8,
170 usage,
171 nullptr);
172
173 GPU_texture_clear(viewport->color_render_tx[1], GPU_DATA_FLOAT, empty_pixel);
174 GPU_texture_clear(viewport->color_overlay_tx[1], GPU_DATA_FLOAT, empty_pixel);
175 }
176
177 /* Can be shared with #GPUOffscreen. */
178 if (viewport->depth_tx == nullptr) {
179 /* Depth texture can be read back by gizmos #view3d_depths_create. */
180 /* Swizzle flag is needed by Workbench Volumes to read the stencil view. */
181 viewport->depth_tx = GPU_texture_create_2d("dtxl_depth",
182 UNPACK2(size),
183 1,
184 blender::gpu::TextureFormat::SFLOAT_32_DEPTH_UINT_8,
187 nullptr);
188 const int depth_clear = 0;
190 }
191
192 if (!viewport->depth_tx || !viewport->color_render_tx[0] || !viewport->color_overlay_tx[0]) {
193 GPU_viewport_free(viewport);
194 }
195}
196
198{
202
203 for (int i = 0; i < 2; i++) {
206 }
207
209}
210
211void GPU_viewport_bind(GPUViewport *viewport, int view, const rcti *rect)
212{
214 /* add one pixel because of scissor test */
215 rect_size[0] = BLI_rcti_size_x(rect) + 1;
216 rect_size[1] = BLI_rcti_size_y(rect) + 1;
217
219
220 if (viewport->size != rect_size) {
221 copy_v2_v2_int(viewport->size, rect_size);
224 }
225
226 viewport->active_view = view;
227}
228
229void GPU_viewport_bind_from_offscreen(GPUViewport *viewport, GPUOffScreen *ofs, bool is_xr_surface)
230{
231 blender::gpu::Texture *color, *depth;
233 viewport->size[0] = GPU_offscreen_width(ofs);
234 viewport->size[1] = GPU_offscreen_height(ofs);
235
236 GPU_offscreen_viewport_data_get(ofs, &fb, &color, &depth);
237
238 /* XR surfaces will already check for texture size changes and free if necessary (see
239 * #wm_xr_session_surface_offscreen_ensure()), so don't free here as it has a significant
240 * performance impact (leads to texture re-creation in #gpu_viewport_textures_create() every VR
241 * drawing iteration). */
242 if (!is_xr_surface) {
244 }
245
246 /* This is the only texture we can share. */
247 viewport->depth_tx = depth;
248
250}
251
253 const ColorManagedViewSettings *view_settings,
254 const ColorManagedDisplaySettings *display_settings,
255 float dither)
256{
264 if (view_settings->curve_mapping) {
265 if (viewport->view_settings.curve_mapping) {
266 if (view_settings->curve_mapping->changed_timestamp !=
268 {
270 }
271 }
272 }
273
274 if (viewport->orig_curve_mapping != view_settings->curve_mapping) {
275 viewport->orig_curve_mapping = view_settings->curve_mapping;
277 }
278 /* Don't copy the curve mapping already. */
280 /* Only copy curve-mapping if needed. Avoid unneeded OCIO cache miss. */
281 if (view_settings->curve_mapping && viewport->view_settings.curve_mapping == nullptr) {
284 }
285
286 BKE_color_managed_display_settings_copy(&viewport->display_settings, display_settings);
287 viewport->dither = dither;
288 viewport->do_color_management = true;
290 &viewport->display_settings, viewport->view_settings.view_transform);
291}
292
294{
296 /* Early Exit: the other display modes need access to the full screen and cannot be
297 * done from a single viewport. See `wm_stereo.cc`. */
298 return;
299 }
300 /* The composite framebuffer object needs to be created in the window context. */
302 &viewport->stereo_comp_fb,
303 {
304 GPU_ATTACHMENT_NONE,
305 /* We need the sRGB attachment to be first for GL_FRAMEBUFFER_SRGB to be turned on.
306 * Note that this is the opposite of what the texture binding is. */
307 GPU_ATTACHMENT_TEXTURE(viewport->color_overlay_tx[0]),
308 GPU_ATTACHMENT_TEXTURE(viewport->color_render_tx[0]),
309 });
310
311 GPUVertFormat *vert_format = immVertexFormat();
312 uint pos = GPU_vertformat_attr_add(vert_format, "pos", blender::gpu::VertAttrType::SFLOAT_32_32);
319 int settings = stereo_format->display_mode;
320 if (settings == S3D_DISPLAY_ANAGLYPH) {
321 switch (stereo_format->anaglyph_type) {
323 GPU_color_mask(false, true, true, true);
324 break;
326 GPU_color_mask(true, false, true, true);
327 break;
329 GPU_color_mask(false, false, true, true);
330 break;
331 }
332 }
333 else if (settings == S3D_DISPLAY_INTERLACE) {
334 settings |= stereo_format->interlace_type << 3;
335 SET_FLAG_FROM_TEST(settings, stereo_format->flag & S3D_INTERLACE_SWAP, 1 << 6);
336 }
337 immUniform1i("stereoDisplaySettings", settings);
338
339 GPU_texture_bind(viewport->color_render_tx[1], 0);
340 GPU_texture_bind(viewport->color_overlay_tx[1], 1);
341
343
344 immVertex2f(pos, -1.0f, -1.0f);
345 immVertex2f(pos, 1.0f, -1.0f);
346 immVertex2f(pos, -1.0f, 1.0f);
347 immVertex2f(pos, 1.0f, 1.0f);
348
349 immEnd();
350
353
357
358 if (settings == S3D_DISPLAY_ANAGLYPH) {
359 GPU_color_mask(true, true, true, true);
360 }
361
363}
364/* -------------------------------------------------------------------- */
367
369{
370 if (g_viewport.format.attr_len == 0) {
373 format, "pos", blender::gpu::VertAttrType::SFLOAT_32_32);
374 g_viewport.attr_id.tex_coord = GPU_vertformat_attr_add(
375 format, "texCoord", blender::gpu::VertAttrType::SFLOAT_32_32);
376 }
377 return g_viewport.format;
378}
379
380static blender::gpu::Batch *gpu_viewport_batch_create(const rctf *rect_pos, const rctf *rect_uv)
381{
383 const uint vbo_len = 4;
384 GPU_vertbuf_data_alloc(*vbo, vbo_len);
385
386 GPUVertBufRaw pos_step, tex_coord_step;
387 GPU_vertbuf_attr_get_raw_data(vbo, g_viewport.attr_id.pos, &pos_step);
388 GPU_vertbuf_attr_get_raw_data(vbo, g_viewport.attr_id.tex_coord, &tex_coord_step);
389
391 static_cast<float *>(GPU_vertbuf_raw_step(&pos_step)), rect_pos->xmin, rect_pos->ymin);
393 static_cast<float *>(GPU_vertbuf_raw_step(&tex_coord_step)), rect_uv->xmin, rect_uv->ymin);
395 static_cast<float *>(GPU_vertbuf_raw_step(&pos_step)), rect_pos->xmax, rect_pos->ymin);
397 static_cast<float *>(GPU_vertbuf_raw_step(&tex_coord_step)), rect_uv->xmax, rect_uv->ymin);
399 static_cast<float *>(GPU_vertbuf_raw_step(&pos_step)), rect_pos->xmin, rect_pos->ymax);
401 static_cast<float *>(GPU_vertbuf_raw_step(&tex_coord_step)), rect_uv->xmin, rect_uv->ymax);
403 static_cast<float *>(GPU_vertbuf_raw_step(&pos_step)), rect_pos->xmax, rect_pos->ymax);
405 static_cast<float *>(GPU_vertbuf_raw_step(&tex_coord_step)), rect_uv->xmax, rect_uv->ymax);
406
408}
409
410static blender::gpu::Batch *gpu_viewport_batch_get(GPUViewport *viewport,
411 const rctf *rect_pos,
412 const rctf *rect_uv)
413{
414 const float compare_limit = 0.0001f;
415 const bool parameters_changed =
417 &viewport->batch.last_used_parameters.rect_pos, rect_pos, compare_limit) ||
418 !BLI_rctf_compare(&viewport->batch.last_used_parameters.rect_uv, rect_uv, compare_limit));
419
420 if (viewport->batch.batch && parameters_changed) {
421 GPU_batch_discard(viewport->batch.batch);
422 viewport->batch.batch = nullptr;
423 }
424
425 if (!viewport->batch.batch) {
426 viewport->batch.batch = gpu_viewport_batch_create(rect_pos, rect_uv);
427 viewport->batch.last_used_parameters.rect_pos = *rect_pos;
428 viewport->batch.last_used_parameters.rect_uv = *rect_uv;
429 }
430 return viewport->batch.batch;
431}
432
434{
435 if (viewport->batch.batch) {
436 GPU_batch_discard(viewport->batch.batch);
437 viewport->batch.batch = nullptr;
438 }
439}
440
442
444 int view,
445 const rctf *rect_pos,
446 const rctf *rect_uv,
447 bool display_colorspace,
448 bool do_overlay_merge)
449{
450 blender::gpu::Texture *color = viewport->color_render_tx[view];
451 blender::gpu::Texture *color_overlay = viewport->color_overlay_tx[view];
452
453 bool use_ocio = false;
454
455 if (viewport->do_color_management && display_colorspace) {
456 /* During the binding process the last used VertexFormat is tested and can assert as it is not
457 * valid. By calling the `immVertexFormat` the last used VertexFormat is reset and the assert
458 * does not happen. This solves a chicken and egg problem when using GPUBatches. GPUBatches
459 * contain the correct vertex format, but can only bind after the shader is bound.
460 *
461 * Image/UV editor still uses imm, after that has been changed we could move this fix to the
462 * OCIO. */
465 &viewport->display_settings,
466 nullptr,
467 viewport->dither,
468 false,
469 do_overlay_merge);
470 }
471
472 blender::gpu::Batch *batch = gpu_viewport_batch_get(viewport, rect_pos, rect_uv);
473 if (use_ocio) {
475 }
476 else {
478 GPU_batch_uniform_1i(batch, "overlay", do_overlay_merge);
479 GPU_batch_uniform_1i(batch, "display_transform", display_colorspace);
480 GPU_batch_uniform_1i(batch, "use_hdr_display", viewport->use_hdr_display);
481 }
482
483 GPU_texture_bind(color, 0);
484 GPU_texture_bind(color_overlay, 1);
486 GPU_texture_unbind(color);
487 GPU_texture_unbind(color_overlay);
488
489 if (use_ocio) {
491 }
492}
493
495 int view,
496 const rcti *rect,
497 bool display_colorspace,
498 bool do_overlay_merge)
499{
500 blender::gpu::Texture *color = viewport->color_render_tx[view];
501
502 if (color == nullptr) {
503 return;
504 }
505
506 const float w = float(GPU_texture_width(color));
507 const float h = float(GPU_texture_height(color));
508
509 /* We allow rects with min/max swapped, but we also need correctly assigned coordinates. */
510 rcti sanitized_rect = *rect;
511 BLI_rcti_sanitize(&sanitized_rect);
512
513 BLI_assert(w == BLI_rcti_size_x(&sanitized_rect) + 1);
514 BLI_assert(h == BLI_rcti_size_y(&sanitized_rect) + 1);
515
516 /* wmOrtho for the screen has this same offset */
517 const float halfx = GLA_PIXEL_OFS / w;
518 const float halfy = GLA_PIXEL_OFS / h;
519
520 rctf pos_rect{};
521 pos_rect.xmin = sanitized_rect.xmin;
522 pos_rect.ymin = sanitized_rect.ymin;
523 pos_rect.xmax = sanitized_rect.xmin + w;
524 pos_rect.ymax = sanitized_rect.ymin + h;
525
526 rctf uv_rect{};
527 uv_rect.xmin = halfx;
528 uv_rect.ymin = halfy;
529 uv_rect.xmax = halfx + 1.0f;
530 uv_rect.ymax = halfy + 1.0f;
531
532 /* Mirror the UV rect in case axis-swapped drawing is requested (by passing a rect with min and
533 * max values swapped). */
534 if (BLI_rcti_size_x(rect) < 0) {
535 std::swap(uv_rect.xmin, uv_rect.xmax);
536 }
537 if (BLI_rcti_size_y(rect) < 0) {
538 std::swap(uv_rect.ymin, uv_rect.ymax);
539 }
540
542 viewport, view, &pos_rect, &uv_rect, display_colorspace, do_overlay_merge);
543}
544
545void GPU_viewport_draw_to_screen(GPUViewport *viewport, int view, const rcti *rect)
546{
547 GPU_viewport_draw_to_screen_ex(viewport, view, rect, true, true);
548}
549
551 GPUOffScreen *ofs,
552 bool display_colorspace,
553 bool do_overlay_merge)
554{
555 const int view = 0;
556
557 if (viewport->color_render_tx[view] == nullptr) {
558 return;
559 }
560
562 GPU_offscreen_bind(ofs, false);
563
564 rctf pos_rect{};
565 pos_rect.xmin = -1.0f;
566 pos_rect.ymin = -1.0f;
567 pos_rect.xmax = 1.0f;
568 pos_rect.ymax = 1.0f;
569
570 rctf uv_rect{};
571 uv_rect.xmin = 0.0f;
572 uv_rect.ymin = 0.0f;
573 uv_rect.xmax = 1.0f;
574 uv_rect.ymax = 1.0f;
575
577 viewport, view, &pos_rect, &uv_rect, display_colorspace, do_overlay_merge);
578
579 /* This one is from the offscreen. Don't free it with the viewport. */
580 viewport->depth_tx = nullptr;
581}
582
588
590{
591 return viewport->active_view;
592}
593
595{
596 return (viewport->flag & GPU_VIEWPORT_STEREO) != 0;
597}
598
603
608
610{
611 return viewport->depth_tx;
612}
613
615{
617 &viewport->render_fb,
618 {
619 GPU_ATTACHMENT_TEXTURE(viewport->depth_tx),
620 GPU_ATTACHMENT_TEXTURE(viewport->color_render_tx[viewport->active_view]),
621 });
622 return viewport->render_fb;
623}
624
626{
628 &viewport->overlay_fb,
629 {
630 GPU_ATTACHMENT_TEXTURE(viewport->depth_tx),
631 GPU_ATTACHMENT_TEXTURE(viewport->color_overlay_tx[viewport->active_view]),
632 });
633 return viewport->overlay_fb;
634}
635
637{
638 if (viewport->draw_data) {
640 }
641
643
645 gpu_viewport_batch_free(viewport);
646
647 MEM_freeN(viewport);
648}
void BKE_color_managed_display_settings_copy(ColorManagedDisplaySettings *new_settings, const ColorManagedDisplaySettings *settings)
void BKE_color_managed_view_settings_free(ColorManagedViewSettings *settings)
CurveMapping * BKE_curvemapping_copy(const CurveMapping *cumap)
void BKE_color_managed_view_settings_copy_keep_curve_mapping(ColorManagedViewSettings *new_settings, const ColorManagedViewSettings *settings)
#define BLI_assert(a)
Definition BLI_assert.h:46
MINLINE void copy_v2_fl2(float v[2], float x, float y)
MINLINE void copy_v2_v2_int(int r[2], const int a[2])
BLI_INLINE int BLI_rcti_size_y(const struct rcti *rct)
Definition BLI_rect.h:198
void BLI_rcti_sanitize(struct rcti *rect)
Definition rct.cc:446
BLI_INLINE int BLI_rcti_size_x(const struct rcti *rct)
Definition BLI_rect.h:194
bool BLI_rctf_compare(const struct rctf *rect_a, const struct rctf *rect_b, float limit)
unsigned int uint
#define UNPACK2(a)
#define SET_FLAG_FROM_TEST(value, test, flag)
#define ELEM(...)
@ S3D_ANAGLYPH_REDCYAN
@ S3D_ANAGLYPH_YELLOWBLUE
@ S3D_ANAGLYPH_GREENMAGENTA
@ S3D_INTERLACE_SWAP
@ S3D_DISPLAY_ANAGLYPH
@ S3D_DISPLAY_INTERLACE
void DRW_gpu_context_disable()
void DRW_gpu_context_enable()
void DRW_viewport_data_free(DRWData *drw_data)
static AppView * view
void GPU_batch_discard(blender::gpu::Batch *batch)
void GPU_batch_program_set_imm_shader(blender::gpu::Batch *batch)
void GPU_batch_program_set_builtin(blender::gpu::Batch *batch, GPUBuiltinShader shader_id)
blender::gpu::Batch * GPU_batch_create_ex(GPUPrimType primitive_type, blender::gpu::VertBuf *vertex_buf, blender::gpu::IndexBuf *index_buf, GPUBatchFlag owns_flag)
Definition gpu_batch.cc:51
@ GPU_BATCH_OWNS_VBO
Definition GPU_batch.hh:42
void GPU_batch_draw(blender::gpu::Batch *batch)
#define GPU_batch_uniform_1i(batch, name, x)
Definition GPU_batch.hh:269
#define GPU_FRAMEBUFFER_FREE_SAFE(fb)
int GPU_offscreen_width(const GPUOffScreen *offscreen)
void GPU_offscreen_bind(GPUOffScreen *offscreen, bool save)
void GPU_framebuffer_restore()
int GPU_offscreen_height(const GPUOffScreen *offscreen)
void GPU_offscreen_viewport_data_get(GPUOffScreen *offscreen, blender::gpu::FrameBuffer **r_fb, blender::gpu::Texture **r_color, blender::gpu::Texture **r_depth)
#define GPU_framebuffer_ensure_config(_fb,...)
void GPU_framebuffer_bind(blender::gpu::FrameBuffer *fb)
void immEnd()
void immUnbindProgram()
void immBindBuiltinProgram(GPUBuiltinShader shader_id)
void immVertex2f(uint attr_id, float x, float y)
void immUniform1i(const char *name, int x)
GPUVertFormat * immVertexFormat()
void immBegin(GPUPrimType, uint vertex_len)
void GPU_matrix_identity_projection_set()
void GPU_matrix_identity_set()
void GPU_matrix_push()
void GPU_matrix_push_projection()
void GPU_matrix_pop_projection()
void GPU_matrix_pop()
@ GPU_PRIM_TRI_STRIP
@ GPU_SHADER_2D_IMAGE_OVERLAYS_STEREO_MERGE
@ GPU_SHADER_2D_IMAGE_OVERLAYS_MERGE
@ GPU_DEPTH_NONE
Definition GPU_state.hh:111
void GPU_depth_test(GPUDepthTest test)
Definition gpu_state.cc:68
void GPU_color_mask(bool r, bool g, bool b, bool a)
Definition gpu_state.cc:98
void GPU_texture_clear(blender::gpu::Texture *texture, eGPUDataFormat data_format, const void *data)
int GPU_texture_height(const blender::gpu::Texture *texture)
void GPU_texture_unbind(blender::gpu::Texture *texture)
int GPU_texture_width(const blender::gpu::Texture *texture)
@ GPU_DATA_UINT_24_8_DEPRECATED
@ GPU_DATA_FLOAT
eGPUTextureUsage
@ GPU_TEXTURE_USAGE_SHADER_READ
@ GPU_TEXTURE_USAGE_SHADER_WRITE
@ GPU_TEXTURE_USAGE_HOST_READ
@ GPU_TEXTURE_USAGE_ATTACHMENT
@ GPU_TEXTURE_USAGE_FORMAT_VIEW
#define GPU_TEXTURE_FREE_SAFE(texture)
blender::gpu::Texture * GPU_texture_create_2d(const char *name, int width, int height, int mip_len, blender::gpu::TextureFormat format, eGPUTextureUsage usage, const float *data)
void GPU_texture_bind(blender::gpu::Texture *texture, int unit)
void GPU_vertbuf_attr_get_raw_data(blender::gpu::VertBuf *, uint a_idx, GPUVertBufRaw *access)
GPU_INLINE void * GPU_vertbuf_raw_step(GPUVertBufRaw *a)
static blender::gpu::VertBuf * GPU_vertbuf_create_with_format(const GPUVertFormat &format)
void GPU_vertbuf_data_alloc(blender::gpu::VertBuf &verts, uint v_len)
uint GPU_vertformat_attr_add(GPUVertFormat *format, blender::StringRef name, blender::gpu::VertAttrType type)
#define GLA_PIXEL_OFS
bool IMB_colormanagement_display_is_hdr(const ColorManagedDisplaySettings *display_settings, const char *view_name)
void IMB_colormanagement_finish_glsl_draw()
bool IMB_colormanagement_setup_glsl_draw_from_space(const ColorManagedViewSettings *view_settings, const ColorManagedDisplaySettings *display_settings, const ColorSpace *from_colorspace, float dither, bool predivide, bool do_overlay_merge)
Read Guarded memory(de)allocation.
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
Definition btDbvt.cpp:52
SIMD_FORCE_INLINE const btScalar & w() const
Return the w value.
Definition btQuadWord.h:119
nullptr float
struct @021025263243242147216143265077100330027142264337::@225245033123204053237120173316075113304004012000 batch
uint pos
struct @021025263243242147216143265077100330027142264337::@240232116316110053135047106323056371161236243121 attr_id
void GPU_viewport_bind(GPUViewport *viewport, int view, const rcti *rect)
void GPU_viewport_unbind(GPUViewport *)
static struct @143276202321147171301317056035115223245173355305 g_viewport
static const GPUVertFormat & gpu_viewport_batch_format()
void GPU_viewport_unbind_from_offscreen(GPUViewport *viewport, GPUOffScreen *ofs, bool display_colorspace, bool do_overlay_merge)
void GPU_viewport_draw_to_screen(GPUViewport *viewport, int view, const rcti *rect)
void GPU_viewport_draw_to_screen_ex(GPUViewport *viewport, int view, const rcti *rect, bool display_colorspace, bool do_overlay_merge)
GPUViewport * GPU_viewport_create()
GPUViewport * GPU_viewport_stereo_create()
static blender::gpu::Batch * gpu_viewport_batch_create(const rctf *rect_pos, const rctf *rect_uv)
@ GPU_VIEWPORT_STEREO
@ DO_UPDATE
static void gpu_viewport_draw_colormanaged(GPUViewport *viewport, int view, const rctf *rect_pos, const rctf *rect_uv, bool display_colorspace, bool do_overlay_merge)
void GPU_viewport_bind_from_offscreen(GPUViewport *viewport, GPUOffScreen *ofs, bool is_xr_surface)
static void gpu_viewport_textures_create(GPUViewport *viewport)
bool GPU_viewport_is_stereo_get(GPUViewport *viewport)
bool GPU_viewport_do_update(GPUViewport *viewport)
static blender::gpu::Batch * gpu_viewport_batch_get(GPUViewport *viewport, const rctf *rect_pos, const rctf *rect_uv)
blender::gpu::FrameBuffer * GPU_viewport_framebuffer_overlay_get(GPUViewport *viewport)
uint tex_coord
int GPU_viewport_active_view_get(GPUViewport *viewport)
static void gpu_viewport_textures_free(GPUViewport *viewport)
void GPU_viewport_free(GPUViewport *viewport)
blender::gpu::Texture * GPU_viewport_overlay_texture(GPUViewport *viewport, int view)
blender::gpu::FrameBuffer * GPU_viewport_framebuffer_render_get(GPUViewport *viewport)
void GPU_viewport_colorspace_set(GPUViewport *viewport, const ColorManagedViewSettings *view_settings, const ColorManagedDisplaySettings *display_settings, float dither)
void GPU_viewport_stereo_composite(GPUViewport *viewport, Stereo3dFormat *stereo_format)
static void gpu_viewport_batch_free(GPUViewport *viewport)
void GPU_viewport_tag_update(GPUViewport *viewport)
blender::gpu::Texture * GPU_viewport_color_texture(GPUViewport *viewport, int view)
blender::gpu::Texture * GPU_viewport_depth_texture(GPUViewport *viewport)
DRWData ** GPU_viewport_data_get(GPUViewport *viewport)
BLI_INLINE float fb(float length, float L)
format
void * MEM_callocN(size_t len, const char *str)
Definition mallocn.cc:118
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
VecBase< int32_t, 2 > int2
return ret
ccl_device_inline int rect_size(const int4 rect)
Definition rect.h:56
struct CurveMapping * curve_mapping
blender::gpu::Batch * batch
struct GPUViewportBatch::@221355136133224036012321245236337260300076357225 last_used_parameters
blender::gpu::Texture * color_overlay_tx[2]
bool use_hdr_display
blender::gpu::FrameBuffer * render_fb
blender::gpu::FrameBuffer * overlay_fb
blender::int2 size
ColorManagedViewSettings view_settings
ColorManagedDisplaySettings display_settings
blender::gpu::Texture * depth_tx
blender::gpu::FrameBuffer * stereo_comp_fb
blender::gpu::Texture * color_render_tx[2]
GPUViewportBatch batch
DRWData * draw_data
CurveMapping * orig_curve_mapping
bool do_color_management
float xmax
float xmin
float ymax
float ymin
int ymin
int xmin
i
Definition text_draw.cc:230