Blender
V4.5
source
blender
draw
engines
eevee
eevee_renderbuffers.cc
Go to the documentation of this file.
1
/* SPDX-FileCopyrightText: 2021 Blender Authors
2
*
3
* SPDX-License-Identifier: GPL-2.0-or-later */
4
14
15
#include "
GPU_texture.hh
"
16
17
#include "
DRW_render.hh
"
18
19
#include "
eevee_film.hh
"
20
#include "
eevee_instance.hh
"
21
22
namespace
blender::eevee
{
23
24
void
RenderBuffers::init
()
25
{
26
const
eViewLayerEEVEEPassType
enabled_passes
= inst_.film.enabled_passes_get();
27
28
data
.color_len = 0;
29
data
.value_len = 0;
30
31
auto
pass_index_get = [&](
eViewLayerEEVEEPassType
pass_type,
int
dependent_passes = 0) {
32
if
(
enabled_passes
& (pass_type | dependent_passes)) {
33
return
pass_storage_type
(pass_type) ==
PASS_STORAGE_COLOR
?
data
.color_len++ :
34
data
.value_len++;
35
}
36
return
-1;
37
};
38
39
data
.normal_id = pass_index_get(
EEVEE_RENDER_PASS_NORMAL
,
EEVEE_RENDER_PASS_AO
);
40
data
.position_id = pass_index_get(
EEVEE_RENDER_PASS_POSITION
);
41
data
.diffuse_light_id = pass_index_get(
EEVEE_RENDER_PASS_DIFFUSE_LIGHT
);
42
data
.diffuse_color_id = pass_index_get(
EEVEE_RENDER_PASS_DIFFUSE_COLOR
);
43
data
.specular_light_id = pass_index_get(
EEVEE_RENDER_PASS_SPECULAR_LIGHT
);
44
data
.specular_color_id = pass_index_get(
EEVEE_RENDER_PASS_SPECULAR_COLOR
);
45
data
.volume_light_id = pass_index_get(
EEVEE_RENDER_PASS_VOLUME_LIGHT
);
46
data
.emission_id = pass_index_get(
EEVEE_RENDER_PASS_EMIT
);
47
data
.environment_id = pass_index_get(
EEVEE_RENDER_PASS_ENVIRONMENT
);
48
data
.shadow_id = pass_index_get(
EEVEE_RENDER_PASS_SHADOW
);
49
data
.ambient_occlusion_id = pass_index_get(
EEVEE_RENDER_PASS_AO
);
50
data
.transparent_id = pass_index_get(
EEVEE_RENDER_PASS_TRANSPARENT
);
51
52
data
.aovs = inst_.film.aovs_info;
53
}
54
55
void
RenderBuffers::acquire
(
int2
extent)
56
{
57
const
eViewLayerEEVEEPassType
enabled_passes
= inst_.film.enabled_passes_get();
58
59
extent_ = extent;
60
61
auto
pass_extent = [&](
eViewLayerEEVEEPassType
pass_bit) ->
int2
{
62
/* Use dummy texture for disabled passes. Allows correct bindings. */
63
return
(
enabled_passes
& pass_bit) ? extent :
int2
(1);
64
};
65
66
eGPUTextureUsage
usage =
GPU_TEXTURE_USAGE_SHADER_READ
|
GPU_TEXTURE_USAGE_ATTACHMENT
;
67
68
/* Depth and combined are always needed. */
69
depth_tx
.ensure_2d(
GPU_DEPTH32F_STENCIL8
, extent, usage);
70
/* TODO(fclem): depth_tx should ideally be a texture from pool but we need stencil_view
71
* which is currently unsupported by pool textures. */
72
// depth_tx.acquire(extent, GPU_DEPTH32F_STENCIL8);
73
combined_tx
.acquire(extent,
color_format
);
74
75
eGPUTextureUsage
usage_attachment_read_write =
GPU_TEXTURE_USAGE_ATTACHMENT
|
76
GPU_TEXTURE_USAGE_SHADER_READ
|
77
GPU_TEXTURE_USAGE_SHADER_WRITE
;
78
79
/* TODO(fclem): Make vector pass allocation optional if no TAA or motion blur is needed. */
80
vector_tx
.acquire(extent,
vector_tx_format
(), usage_attachment_read_write);
81
82
const
bool
do_motion_vectors_swizzle =
vector_tx_format
() ==
GPU_RG16F
;
83
if
(do_motion_vectors_swizzle) {
84
/* Change texture swizzling to avoid complexity in shaders. */
85
GPU_texture_swizzle_set
(
vector_tx
,
"rgrg"
);
86
}
87
88
int
color_len =
data
.color_len +
data
.aovs.color_len;
89
int
value_len =
data
.value_len +
data
.aovs.value_len;
90
91
rp_color_tx
.ensure_2d_array(
color_format
,
92
(color_len > 0) ? extent :
int2
(1),
93
math::max
(1, color_len),
94
usage_attachment_read_write);
95
rp_value_tx
.ensure_2d_array(
float_format
,
96
(value_len > 0) ? extent :
int2
(1),
97
math::max
(1, value_len),
98
usage_attachment_read_write);
99
100
const
eGPUTextureFormat
cryptomatte_format =
GPU_RGBA32F
;
101
cryptomatte_tx
.acquire(pass_extent(
EEVEE_RENDER_PASS_CRYPTOMATTE_OBJECT
|
102
EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET
|
103
EEVEE_RENDER_PASS_CRYPTOMATTE_MATERIAL
),
104
cryptomatte_format,
105
GPU_TEXTURE_USAGE_SHADER_READ
|
GPU_TEXTURE_USAGE_SHADER_WRITE
);
106
}
107
108
void
RenderBuffers::release
()
109
{
110
/* TODO(fclem): depth_tx should ideally be a texture from pool but we need stencil_view
111
* which is currently unsupported by pool textures. */
112
// depth_tx.release();
113
combined_tx
.release();
114
115
const
bool
do_motion_vectors_swizzle =
vector_tx_format
() ==
GPU_RG16F
;
116
if
(do_motion_vectors_swizzle) {
117
/* Reset swizzle since this texture might be reused in other places. */
118
GPU_texture_swizzle_set
(
vector_tx
,
"rgba"
);
119
}
120
vector_tx
.release();
121
122
cryptomatte_tx
.release();
123
}
124
125
eGPUTextureFormat
RenderBuffers::vector_tx_format
()
126
{
127
const
eViewLayerEEVEEPassType
enabled_passes
= inst_.film.enabled_passes_get();
128
bool
do_full_vector_render_pass = ((
enabled_passes
&
EEVEE_RENDER_PASS_VECTOR
) ||
129
inst_.motion_blur.postfx_enabled()) &&
130
!inst_.is_viewport();
131
132
/* Only RG16F (`motion.prev`) for the viewport. */
133
return
do_full_vector_render_pass ?
GPU_RGBA16F
:
GPU_RG16F
;
134
}
135
136
}
// namespace blender::eevee
eViewLayerEEVEEPassType
eViewLayerEEVEEPassType
Definition
DNA_layer_types.h:20
EEVEE_RENDER_PASS_CRYPTOMATTE_MATERIAL
@ EEVEE_RENDER_PASS_CRYPTOMATTE_MATERIAL
Definition
DNA_layer_types.h:45
EEVEE_RENDER_PASS_AO
@ EEVEE_RENDER_PASS_AO
Definition
DNA_layer_types.h:34
EEVEE_RENDER_PASS_NORMAL
@ EEVEE_RENDER_PASS_NORMAL
Definition
DNA_layer_types.h:24
EEVEE_RENDER_PASS_CRYPTOMATTE_OBJECT
@ EEVEE_RENDER_PASS_CRYPTOMATTE_OBJECT
Definition
DNA_layer_types.h:43
EEVEE_RENDER_PASS_DIFFUSE_LIGHT
@ EEVEE_RENDER_PASS_DIFFUSE_LIGHT
Definition
DNA_layer_types.h:25
EEVEE_RENDER_PASS_VOLUME_LIGHT
@ EEVEE_RENDER_PASS_VOLUME_LIGHT
Definition
DNA_layer_types.h:30
EEVEE_RENDER_PASS_DIFFUSE_COLOR
@ EEVEE_RENDER_PASS_DIFFUSE_COLOR
Definition
DNA_layer_types.h:26
EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET
@ EEVEE_RENDER_PASS_CRYPTOMATTE_ASSET
Definition
DNA_layer_types.h:44
EEVEE_RENDER_PASS_ENVIRONMENT
@ EEVEE_RENDER_PASS_ENVIRONMENT
Definition
DNA_layer_types.h:32
EEVEE_RENDER_PASS_SPECULAR_LIGHT
@ EEVEE_RENDER_PASS_SPECULAR_LIGHT
Definition
DNA_layer_types.h:27
EEVEE_RENDER_PASS_VECTOR
@ EEVEE_RENDER_PASS_VECTOR
Definition
DNA_layer_types.h:46
EEVEE_RENDER_PASS_SPECULAR_COLOR
@ EEVEE_RENDER_PASS_SPECULAR_COLOR
Definition
DNA_layer_types.h:28
EEVEE_RENDER_PASS_EMIT
@ EEVEE_RENDER_PASS_EMIT
Definition
DNA_layer_types.h:31
EEVEE_RENDER_PASS_TRANSPARENT
@ EEVEE_RENDER_PASS_TRANSPARENT
Definition
DNA_layer_types.h:47
EEVEE_RENDER_PASS_SHADOW
@ EEVEE_RENDER_PASS_SHADOW
Definition
DNA_layer_types.h:33
EEVEE_RENDER_PASS_POSITION
@ EEVEE_RENDER_PASS_POSITION
Definition
DNA_layer_types.h:48
DRW_render.hh
GPU_texture.hh
eGPUTextureUsage
eGPUTextureUsage
Definition
GPU_texture.hh:767
GPU_TEXTURE_USAGE_SHADER_READ
@ GPU_TEXTURE_USAGE_SHADER_READ
Definition
GPU_texture.hh:769
GPU_TEXTURE_USAGE_SHADER_WRITE
@ GPU_TEXTURE_USAGE_SHADER_WRITE
Definition
GPU_texture.hh:771
GPU_TEXTURE_USAGE_ATTACHMENT
@ GPU_TEXTURE_USAGE_ATTACHMENT
Definition
GPU_texture.hh:773
eGPUTextureFormat
eGPUTextureFormat
Definition
GPU_texture.hh:648
GPU_RG16F
@ GPU_RG16F
Definition
GPU_texture.hh:667
GPU_DEPTH32F_STENCIL8
@ GPU_DEPTH32F_STENCIL8
Definition
GPU_texture.hh:689
GPU_RGBA32F
@ GPU_RGBA32F
Definition
GPU_texture.hh:660
GPU_RGBA16F
@ GPU_RGBA16F
Definition
GPU_texture.hh:656
GPU_texture_swizzle_set
void GPU_texture_swizzle_set(GPUTexture *texture, const char swizzle[4])
Definition
gpu_texture.cc:664
blender::eevee::RenderBuffers::cryptomatte_tx
TextureFromPool cryptomatte_tx
Definition
eevee_renderbuffers.hh:35
blender::eevee::RenderBuffers::pass_storage_type
static ePassStorageType pass_storage_type(eViewLayerEEVEEPassType pass_type)
Definition
eevee_renderbuffers.hh:49
blender::eevee::RenderBuffers::combined_tx
TextureFromPool combined_tx
Definition
eevee_renderbuffers.hh:31
blender::eevee::RenderBuffers::color_format
static constexpr eGPUTextureFormat color_format
Definition
eevee_renderbuffers.hh:27
blender::eevee::RenderBuffers::init
void init()
Definition
eevee_renderbuffers.cc:24
blender::eevee::RenderBuffers::float_format
static constexpr eGPUTextureFormat float_format
Definition
eevee_renderbuffers.hh:28
blender::eevee::RenderBuffers::depth_tx
Texture depth_tx
Definition
eevee_renderbuffers.hh:30
blender::eevee::RenderBuffers::vector_tx_format
eGPUTextureFormat vector_tx_format()
Definition
eevee_renderbuffers.cc:125
blender::eevee::RenderBuffers::acquire
void acquire(int2 extent)
Definition
eevee_renderbuffers.cc:55
blender::eevee::RenderBuffers::rp_color_tx
Texture rp_color_tx
Definition
eevee_renderbuffers.hh:37
blender::eevee::RenderBuffers::rp_value_tx
Texture rp_value_tx
Definition
eevee_renderbuffers.hh:38
blender::eevee::RenderBuffers::data
RenderBuffersInfoData & data
Definition
eevee_renderbuffers.hh:25
blender::eevee::RenderBuffers::release
void release()
Definition
eevee_renderbuffers.cc:108
blender::eevee::RenderBuffers::vector_tx
TextureFromPool vector_tx
Definition
eevee_renderbuffers.hh:34
eevee_film.hh
eevee_instance.hh
blender::eevee
Definition
eevee_ambient_occlusion.cc:29
blender::eevee::enabled_passes
static eViewLayerEEVEEPassType enabled_passes(const ViewLayer *view_layer)
Definition
eevee_film.cc:197
blender::eevee::PASS_STORAGE_COLOR
@ PASS_STORAGE_COLOR
Definition
eevee_shader_shared.hh:400
blender::math::max
T max(const T &a, const T &b)
Definition
BLI_math_base.hh:49
blender::int2
VecBase< int32_t, 2 > int2
Definition
BLI_math_vector_types.hh:601
Generated on
for Blender by
doxygen
1.16.1