Blender  V2.93
Classes | Macros | Typedefs | Enumerations | Functions | Variables
gpu_viewport.c File Reference
#include <string.h>
#include "BLI_listbase.h"
#include "BLI_math_vector.h"
#include "BLI_memblock.h"
#include "BLI_rect.h"
#include "BKE_colortools.h"
#include "IMB_colormanagement.h"
#include "DNA_userdef_types.h"
#include "DNA_vec_types.h"
#include "GPU_framebuffer.h"
#include "GPU_immediate.h"
#include "GPU_matrix.h"
#include "GPU_texture.h"
#include "GPU_uniform_buffer.h"
#include "GPU_viewport.h"
#include "DRW_engine.h"
#include "MEM_guardedalloc.h"

Go to the source code of this file.

Classes

struct  ViewportTempTexture
 
struct  GPUViewportBatch
 
struct  GPUViewport
 

Macros

#define MAX_ENABLE_ENGINE   8
 
#define MAX_ENGINE_BUFFER_SHARING   5
 

Typedefs

typedef struct ViewportTempTexture ViewportTempTexture
 

Enumerations

enum  { DO_UPDATE = (1 << 0) , GPU_VIEWPORT_STEREO = (1 << 1) }
 

Functions

static void gpu_viewport_buffers_free (FramebufferList *fbl, int fbl_len, TextureList *txl, TextureList *txl_stereo, int txl_len)
 
static void gpu_viewport_storage_free (StorageList *stl, int stl_len)
 
static void gpu_viewport_passes_free (PassList *psl, int psl_len)
 
static void gpu_viewport_texture_pool_free (GPUViewport *viewport)
 
void GPU_viewport_tag_update (GPUViewport *viewport)
 
bool GPU_viewport_do_update (GPUViewport *viewport)
 
GPUViewportGPU_viewport_create (void)
 
GPUViewportGPU_viewport_stereo_create (void)
 
static void gpu_viewport_framebuffer_view_set (GPUViewport *viewport, int view)
 
void * GPU_viewport_engine_data_create (GPUViewport *viewport, void *engine_type)
 
static void gpu_viewport_engines_data_free (GPUViewport *viewport)
 
void * GPU_viewport_engine_data_get (GPUViewport *viewport, void *engine_handle)
 
ViewportMemoryPoolGPU_viewport_mempool_get (GPUViewport *viewport)
 
struct DRWInstanceDataListGPU_viewport_instance_data_list_get (GPUViewport *viewport)
 
void GPU_viewport_active_view_set (GPUViewport *viewport, int view)
 
void * GPU_viewport_framebuffer_list_get (GPUViewport *viewport)
 
void * GPU_viewport_texture_list_get (GPUViewport *viewport)
 
void GPU_viewport_size_get (const GPUViewport *viewport, int size[2])
 
void GPU_viewport_size_set (GPUViewport *viewport, const int size[2])
 
doubleGPU_viewport_cache_time_get (GPUViewport *viewport)
 
GPUTextureGPU_viewport_texture_pool_query (GPUViewport *viewport, void *engine, int width, int height, int format)
 
static void gpu_viewport_texture_pool_clear_users (GPUViewport *viewport)
 
bool GPU_viewport_engines_data_validate (GPUViewport *viewport, void **engine_handle_array)
 
void GPU_viewport_cache_release (GPUViewport *viewport)
 
static void gpu_viewport_default_fb_create (GPUViewport *viewport)
 
void GPU_viewport_bind (GPUViewport *viewport, int view, const rcti *rect)
 
void GPU_viewport_bind_from_offscreen (GPUViewport *viewport, struct GPUOffScreen *ofs)
 
void GPU_viewport_colorspace_set (GPUViewport *viewport, ColorManagedViewSettings *view_settings, ColorManagedDisplaySettings *display_settings, float dither)
 
void GPU_viewport_stereo_composite (GPUViewport *viewport, Stereo3dFormat *stereo_format)
 
static void gpu_viewport_draw_colormanaged (GPUViewport *viewport, const rctf *rect_pos, const rctf *rect_uv, bool display_colorspace, bool do_overlay_merge)
 
void GPU_viewport_draw_to_screen_ex (GPUViewport *viewport, int view, const rcti *rect, bool display_colorspace, bool do_overlay_merge)
 
void GPU_viewport_draw_to_screen (GPUViewport *viewport, int view, const rcti *rect)
 
void GPU_viewport_unbind_from_offscreen (GPUViewport *viewport, struct GPUOffScreen *ofs, bool display_colorspace, bool do_overlay_merge)
 
void GPU_viewport_unbind (GPUViewport *UNUSED(viewport))
 
GPUTextureGPU_viewport_color_texture (GPUViewport *viewport, int view)
 
void GPU_viewport_free (GPUViewport *viewport)
 
GPUFrameBufferGPU_viewport_framebuffer_default_get (GPUViewport *viewport)
 
GPUFrameBufferGPU_viewport_framebuffer_overlay_get (GPUViewport *viewport)
 
Viewport Batches
static GPUVertFormatgpu_viewport_batch_format (void)
 
static GPUBatchgpu_viewport_batch_create (const rctf *rect_pos, const rctf *rect_uv)
 
static GPUBatchgpu_viewport_batch_get (GPUViewport *viewport, const rctf *rect_pos, const rctf *rect_uv)
 
static void gpu_viewport_batch_free (GPUViewport *viewport)
 

Variables

static const int default_fbl_len = (sizeof(DefaultFramebufferList)) / sizeof(void *)
 
static const int default_txl_len = (sizeof(DefaultTextureList)) / sizeof(void *)
 
struct {
   GPUVertFormat   format
 
   struct {
      uint   pos
 
      uint   tex_coord
 
   }   attr_id
 
g_viewport = {{0}}
 

Detailed Description

System that manages viewport drawing.

Definition in file gpu_viewport.c.

Macro Definition Documentation

◆ MAX_ENABLE_ENGINE

#define MAX_ENABLE_ENGINE   8

Definition at line 54 of file gpu_viewport.c.

◆ MAX_ENGINE_BUFFER_SHARING

#define MAX_ENGINE_BUFFER_SHARING   5

Definition at line 59 of file gpu_viewport.c.

Typedef Documentation

◆ ViewportTempTexture

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
DO_UPDATE 
GPU_VIEWPORT_STEREO 

Definition at line 121 of file gpu_viewport.c.

Function Documentation

◆ GPU_viewport_active_view_set()

void GPU_viewport_active_view_set ( GPUViewport viewport,
int  view 
)

Definition at line 321 of file gpu_viewport.c.

References gpu_viewport_framebuffer_view_set(), and view.

Referenced by DRW_notify_view_update().

◆ gpu_viewport_batch_create()

static GPUBatch* gpu_viewport_batch_create ( const rctf rect_pos,
const rctf rect_uv 
)
static

◆ gpu_viewport_batch_format()

static GPUVertFormat* gpu_viewport_batch_format ( void  )
static

◆ gpu_viewport_batch_free()

static void gpu_viewport_batch_free ( GPUViewport viewport)
static

Definition at line 739 of file gpu_viewport.c.

References GPUViewportBatch::batch, GPUViewport::batch, GPU_batch_discard(), and NULL.

Referenced by GPU_viewport_free().

◆ gpu_viewport_batch_get()

static GPUBatch* gpu_viewport_batch_get ( GPUViewport viewport,
const rctf rect_pos,
const rctf rect_uv 
)
static

◆ GPU_viewport_bind()

void GPU_viewport_bind ( GPUViewport viewport,
int  view,
const rcti rect 
)

◆ GPU_viewport_bind_from_offscreen()

void GPU_viewport_bind_from_offscreen ( GPUViewport viewport,
struct GPUOffScreen ofs 
)

◆ gpu_viewport_buffers_free()

static void gpu_viewport_buffers_free ( FramebufferList fbl,
int  fbl_len,
TextureList txl,
TextureList txl_stereo,
int  txl_len 
)
static

◆ GPU_viewport_cache_release()

void GPU_viewport_cache_release ( GPUViewport viewport)

◆ GPU_viewport_cache_time_get()

double* GPU_viewport_cache_time_get ( GPUViewport viewport)

◆ GPU_viewport_color_texture()

GPUTexture* GPU_viewport_color_texture ( GPUViewport viewport,
int  view 
)

◆ GPU_viewport_colorspace_set()

void GPU_viewport_colorspace_set ( GPUViewport viewport,
ColorManagedViewSettings view_settings,
ColorManagedDisplaySettings display_settings,
float  dither 
)

HACK(fclem): We copy the settings here to avoid use after free if an update frees the scene and the viewport stays cached (see T75443). But this means the OCIO curve-mapping caching (which is based on CurveMap pointer address) cannot operate correctly and it will create a different OCIO processor for each viewport. We try to only reallocate the curve-map copy if needed to avoid unneeded cache invalidation.

Definition at line 557 of file gpu_viewport.c.

References BKE_color_managed_display_settings_copy(), BKE_color_managed_view_settings_copy(), BKE_color_managed_view_settings_free(), BKE_curvemapping_copy(), CurveMapping::changed_timestamp, ColorManagedViewSettings::curve_mapping, GPUViewport::display_settings, GPUViewport::dither, GPUViewport::do_color_management, NULL, GPUViewport::orig_curve_mapping, and GPUViewport::view_settings.

Referenced by drw_viewport_colormanagement_set().

◆ GPU_viewport_create()

GPUViewport* GPU_viewport_create ( void  )

◆ gpu_viewport_default_fb_create()

static void gpu_viewport_default_fb_create ( GPUViewport viewport)
static

◆ GPU_viewport_do_update()

bool GPU_viewport_do_update ( GPUViewport viewport)

Definition at line 137 of file gpu_viewport.c.

References DO_UPDATE, GPUViewport::flag, and ret.

Referenced by wm_region_test_render_do_draw().

◆ gpu_viewport_draw_colormanaged()

static void gpu_viewport_draw_colormanaged ( GPUViewport viewport,
const rctf rect_pos,
const rctf rect_uv,
bool  display_colorspace,
bool  do_overlay_merge 
)
static

◆ GPU_viewport_draw_to_screen()

void GPU_viewport_draw_to_screen ( GPUViewport viewport,
int  view,
const rcti rect 
)

Merge and draw the buffers of viewport into the currently active framebuffer, performing color transform to display space.

Parameters
rectCoordinates to draw into. By swapping min and max values, drawing can be done with inversed axis coordinates (upside down or sideways).

Definition at line 867 of file gpu_viewport.c.

References GPU_viewport_draw_to_screen_ex(), and view.

Referenced by wm_draw_region_blit().

◆ GPU_viewport_draw_to_screen_ex()

void GPU_viewport_draw_to_screen_ex ( GPUViewport viewport,
int  view,
const rcti rect,
bool  display_colorspace,
bool  do_overlay_merge 
)

◆ GPU_viewport_engine_data_create()

void* GPU_viewport_engine_data_create ( GPUViewport viewport,
void *  engine_type 
)

◆ GPU_viewport_engine_data_get()

void* GPU_viewport_engine_data_get ( GPUViewport viewport,
void *  engine_handle 
)

◆ gpu_viewport_engines_data_free()

static void gpu_viewport_engines_data_free ( GPUViewport viewport)
static

◆ GPU_viewport_engines_data_validate()

bool GPU_viewport_engines_data_validate ( GPUViewport viewport,
void **  engine_handle_array 
)

◆ GPU_viewport_framebuffer_default_get()

GPUFrameBuffer* GPU_viewport_framebuffer_default_get ( GPUViewport viewport)

◆ GPU_viewport_framebuffer_list_get()

void* GPU_viewport_framebuffer_list_get ( GPUViewport viewport)

◆ GPU_viewport_framebuffer_overlay_get()

GPUFrameBuffer* GPU_viewport_framebuffer_overlay_get ( GPUViewport viewport)

◆ gpu_viewport_framebuffer_view_set()

static void gpu_viewport_framebuffer_view_set ( GPUViewport viewport,
int  view 
)
static

◆ GPU_viewport_free()

void GPU_viewport_free ( GPUViewport viewport)

◆ GPU_viewport_instance_data_list_get()

struct DRWInstanceDataList* GPU_viewport_instance_data_list_get ( GPUViewport viewport)

Definition at line 311 of file gpu_viewport.c.

References GPUViewport::idatalist.

Referenced by drw_viewport_var_init().

◆ GPU_viewport_mempool_get()

ViewportMemoryPool* GPU_viewport_mempool_get ( GPUViewport viewport)

Definition at line 306 of file gpu_viewport.c.

References GPUViewport::vmempool.

Referenced by drw_viewport_var_init().

◆ gpu_viewport_passes_free()

static void gpu_viewport_passes_free ( PassList psl,
int  psl_len 
)
static

Definition at line 972 of file gpu_viewport.c.

References PassList::passes.

Referenced by GPU_viewport_cache_release(), and gpu_viewport_engines_data_free().

◆ GPU_viewport_size_get()

void GPU_viewport_size_get ( const GPUViewport viewport,
int  size[2] 
)

Definition at line 336 of file gpu_viewport.c.

References copy_v2_v2_int(), size(), and GPUViewport::size.

Referenced by drw_viewport_var_init().

◆ GPU_viewport_size_set()

void GPU_viewport_size_set ( GPUViewport viewport,
const int  size[2] 
)

Special case, this is needed for when we have a viewport without a frame-buffer output (occlusion queries for eg) but still need to set the size since it may be used for other calculations.

Definition at line 346 of file gpu_viewport.c.

References copy_v2_v2_int(), size(), and GPUViewport::size.

Referenced by DRW_custom_pipeline(), DRW_draw_select_loop(), DRW_render_gpencil(), and DRW_render_to_image().

◆ GPU_viewport_stereo_composite()

void GPU_viewport_stereo_composite ( GPUViewport viewport,
Stereo3dFormat stereo_format 
)

◆ GPU_viewport_stereo_create()

GPUViewport* GPU_viewport_stereo_create ( void  )

◆ gpu_viewport_storage_free()

static void gpu_viewport_storage_free ( StorageList stl,
int  stl_len 
)
static

Definition at line 961 of file gpu_viewport.c.

References MEM_freeN, NULL, and StorageList::storage.

Referenced by gpu_viewport_engines_data_free().

◆ GPU_viewport_tag_update()

void GPU_viewport_tag_update ( GPUViewport viewport)

Definition at line 132 of file gpu_viewport.c.

References DO_UPDATE, and GPUViewport::flag.

Referenced by DRW_viewport_request_redraw().

◆ GPU_viewport_texture_list_get()

void* GPU_viewport_texture_list_get ( GPUViewport viewport)

Definition at line 331 of file gpu_viewport.c.

References GPUViewport::txl.

Referenced by DRW_viewport_texture_list_get(), and view3d_opengl_read_Z_pixels().

◆ gpu_viewport_texture_pool_clear_users()

static void gpu_viewport_texture_pool_clear_users ( GPUViewport viewport)
static

◆ gpu_viewport_texture_pool_free()

static void gpu_viewport_texture_pool_free ( GPUViewport viewport)
static

◆ GPU_viewport_texture_pool_query()

GPUTexture* GPU_viewport_texture_pool_query ( GPUViewport viewport,
void *  engine,
int  width,
int  height,
int  format 
)

◆ GPU_viewport_unbind()

void GPU_viewport_unbind ( GPUViewport UNUSEDviewport)

Definition at line 911 of file gpu_viewport.c.

References DRW_opengl_context_disable(), and GPU_framebuffer_restore().

◆ GPU_viewport_unbind_from_offscreen()

void GPU_viewport_unbind_from_offscreen ( GPUViewport viewport,
struct GPUOffScreen ofs,
bool  display_colorspace,
bool  do_overlay_merge 
)

Variable Documentation

◆ 

struct { ... } attr_id

◆ default_fbl_len

const int default_fbl_len = (sizeof(DefaultFramebufferList)) / sizeof(void *)
static

Definition at line 51 of file gpu_viewport.c.

Referenced by GPU_viewport_bind(), and GPU_viewport_free().

◆ default_txl_len

const int default_txl_len = (sizeof(DefaultTextureList)) / sizeof(void *)
static

Definition at line 52 of file gpu_viewport.c.

Referenced by GPU_viewport_bind(), and GPU_viewport_free().

◆ format

Definition at line 79 of file gpu_viewport.c.

◆ 

struct { ... } g_viewport

◆ pos

uint pos

Definition at line 81 of file gpu_viewport.c.

Referenced by GPU_viewport_stereo_composite().

◆ tex_coord

uint tex_coord

Definition at line 81 of file gpu_viewport.c.

Referenced by add_node(), and shader_preview_texture().