Blender
V4.3
source
blender
compositor
realtime_compositor
intern
reduce_to_single_value_operation.cc
Go to the documentation of this file.
1
/* SPDX-FileCopyrightText: 2023 Blender Authors
2
*
3
* SPDX-License-Identifier: GPL-2.0-or-later */
4
5
#include "
BLI_assert.h
"
6
7
#include "
GPU_state.hh
"
8
#include "
GPU_texture.hh
"
9
10
#include "
MEM_guardedalloc.h
"
11
12
#include "
COM_context.hh
"
13
#include "
COM_input_descriptor.hh
"
14
#include "
COM_reduce_to_single_value_operation.hh
"
15
#include "
COM_result.hh
"
16
17
namespace
blender::realtime_compositor
{
18
19
ReduceToSingleValueOperation::ReduceToSingleValueOperation
(
Context
&context,
ResultType
type)
20
:
SimpleOperation
(context)
21
{
22
InputDescriptor
input_descriptor;
23
input_descriptor.
type
= type;
24
declare_input_descriptor
(input_descriptor);
25
populate_result
(context.create_result(type));
26
}
27
28
void
ReduceToSingleValueOperation::execute
()
29
{
30
/* Make sure any prior writes to the texture are reflected before downloading it. */
31
GPU_memory_barrier
(
GPU_BARRIER_TEXTURE_UPDATE
);
32
33
const
Result
&input =
get_input
();
34
float
*pixel =
static_cast<
float
*
>
(
GPU_texture_read
(input,
GPU_DATA_FLOAT
, 0));
35
36
Result
&result =
get_result
();
37
result.allocate_single_value();
38
switch
(result.type()) {
39
case
ResultType::Color
:
40
result.set_color_value(pixel);
41
break
;
42
case
ResultType::Vector
:
43
result.set_vector_value(pixel);
44
break
;
45
case
ResultType::Float
:
46
result.set_float_value(*pixel);
47
break
;
48
default
:
49
/* Other types are internal and needn't be handled by operations. */
50
BLI_assert_unreachable
();
51
break
;
52
}
53
54
MEM_freeN
(pixel);
55
}
56
57
SimpleOperation
*
ReduceToSingleValueOperation::construct_if_needed
(
Context
&context,
58
const
Result
&input_result)
59
{
60
/* Input result is already a single value, the operation is not needed. */
61
if
(input_result.
is_single_value
()) {
62
return
nullptr
;
63
}
64
65
/* The input is a full sized texture and can't be reduced to a single value, the operation is not
66
* needed. */
67
if
(input_result.
domain
().
size
!=
int2
(1)) {
68
return
nullptr
;
69
}
70
71
/* The input is a texture of a single pixel and can be reduced to a single value. */
72
return
new
ReduceToSingleValueOperation
(context, input_result.
type
());
73
}
74
75
}
// namespace blender::realtime_compositor
BLI_assert.h
BLI_assert_unreachable
#define BLI_assert_unreachable()
Definition
BLI_assert.h:97
COM_context.hh
COM_input_descriptor.hh
COM_reduce_to_single_value_operation.hh
COM_result.hh
GPU_state.hh
GPU_memory_barrier
void GPU_memory_barrier(eGPUBarrier barrier)
Definition
gpu_state.cc:374
GPU_BARRIER_TEXTURE_UPDATE
@ GPU_BARRIER_TEXTURE_UPDATE
Definition
GPU_state.hh:39
GPU_texture.hh
GPU_texture_read
void * GPU_texture_read(GPUTexture *texture, eGPUDataFormat data_format, int mip_level)
Definition
gpu_texture.cc:542
GPU_DATA_FLOAT
@ GPU_DATA_FLOAT
Definition
GPU_texture.hh:497
MEM_guardedalloc.h
Read Guarded memory(de)allocation.
blender::realtime_compositor::Context
Definition
COM_context.hh:37
blender::realtime_compositor::Domain::size
int2 size
Definition
COM_domain.hh:138
blender::realtime_compositor::InputDescriptor
Definition
COM_input_descriptor.hh:25
blender::realtime_compositor::InputDescriptor::type
ResultType type
Definition
COM_input_descriptor.hh:30
blender::realtime_compositor::ReduceToSingleValueOperation::ReduceToSingleValueOperation
ReduceToSingleValueOperation(Context &context, ResultType type)
Definition
reduce_to_single_value_operation.cc:19
blender::realtime_compositor::ReduceToSingleValueOperation::construct_if_needed
static SimpleOperation * construct_if_needed(Context &context, const Result &input_result)
Definition
reduce_to_single_value_operation.cc:57
blender::realtime_compositor::ReduceToSingleValueOperation::execute
void execute() override
Definition
reduce_to_single_value_operation.cc:28
blender::realtime_compositor::Result
Definition
COM_result.hh:92
blender::realtime_compositor::Result::domain
const Domain & domain() const
Definition
result.cc:712
blender::realtime_compositor::Result::is_single_value
bool is_single_value() const
Definition
result.cc:684
blender::realtime_compositor::Result::type
static ResultType type(eGPUTextureFormat format)
Definition
result.cc:148
blender::realtime_compositor::SimpleOperation
Definition
COM_simple_operation.hh:21
blender::realtime_compositor::SimpleOperation::get_input
Result & get_input()
Definition
simple_operation.cc:27
blender::realtime_compositor::SimpleOperation::populate_result
void populate_result(Result result)
Definition
simple_operation.cc:37
blender::realtime_compositor::SimpleOperation::get_result
Result & get_result()
Definition
simple_operation.cc:15
blender::realtime_compositor::SimpleOperation::declare_input_descriptor
void declare_input_descriptor(InputDescriptor descriptor)
Definition
simple_operation.cc:45
MEM_freeN
void MEM_freeN(void *vmemh)
Definition
mallocn.cc:105
blender::realtime_compositor
Definition
BKE_node.hh:80
blender::realtime_compositor::ResultType
ResultType
Definition
COM_result.hh:21
blender::realtime_compositor::ResultType::Float
@ Float
blender::realtime_compositor::ResultType::Vector
@ Vector
blender::realtime_compositor::ResultType::Color
@ Color
blender::VecBase< int32_t, 2 >
Generated on Thu Feb 6 2025 07:36:39 for Blender by
doxygen
1.11.0