4 #include "testing/testing.h"
22 return (
float *)
MEM_callocN(
len *
sizeof(
float),
"COM_BuffersIteratorTest");
30 for (
int i = 0; i <
len; i++) {
31 buf[i] = input_idx * 1.5f * (i + 1) + i * 0.9f;
43 bool use_single_elem_inputs_;
46 static rcti buffer_area;
47 static rcti buffer_offset_area;
59 use_single_elem_inputs_ =
false;
60 validate_iteration(iter_func, validate_elem_func);
62 use_single_elem_inputs_ =
true;
63 validate_iteration(iter_func, validate_elem_func);
86 single_elem_inputs[i] =
nullptr;
88 full_buffer_inputs[i] =
nullptr;
95 use_single_elem_inputs_ =
false;
109 use_offsets_ =
false;
111 iter_func(it, buffer_area);
112 validate_result(buffer_area, validate_elem_func);
117 iter_func(it, buffer_offset_area);
118 validate_result(buffer_offset_area, validate_elem_func);
127 BuffersIterator<float> it = offset_iterate(
area);
129 validate_result(
area, validate_elem_func);
135 Span<const float *>
inputs = get_inputs();
136 Array<const float *> ins(
inputs.size());
141 float *
out = &output_[out_offset];
143 const int in_offset = use_single_elem_inputs_ ? 0 : out_offset;
144 for (
int i = 0; i <
inputs.size(); i++) {
145 ins[i] = &
inputs[i][in_offset];
148 if (validate_elem_func) {
149 validate_elem_func(
out, ins,
x,
y);
155 Span<const float *> get_inputs()
158 return use_single_elem_inputs_ ? single_elem_inputs : full_buffer_inputs;
163 int get_buffer_relative_x(
int x)
167 int get_buffer_relative_y(
int y)
173 BuffersIterator<float> iterate()
178 const int input_stride = use_single_elem_inputs_ ? 0 :
NUM_CHANNELS;
179 for (
const float *
input : get_inputs()) {
183 return builder.build();
187 BuffersIterator<float> offset_iterate(
const rcti &
area)
190 const rcti &buf_area = buffer_offset_area;
191 BuffersIteratorBuilder<float> builder(output_, buf_area,
area,
NUM_CHANNELS);
193 const int input_stride = use_single_elem_inputs_ ? 0 :
NUM_CHANNELS;
194 for (
const float *
input : get_inputs()) {
195 builder.add_input(
input, buf_area, input_stride);
198 return builder.build();
202 rcti BuffersIteratorTest::buffer_area;
203 rcti BuffersIteratorTest::buffer_offset_area;
204 Array<const float *, NUM_INPUTS> BuffersIteratorTest::single_elem_inputs(
NUM_INPUTS);
205 Array<const float *, NUM_INPUTS> BuffersIteratorTest::full_buffer_inputs(
NUM_INPUTS);
211 for (; !it.is_end(); ++it) {
215 if (
x ==
area.xmax) {
226 set_inputs_enabled(
false);
232 set_inputs_enabled(
true);
238 set_inputs_enabled(
false);
242 for (; !it.is_end(); ++it) {
244 it.out[0] = dummy + 1.0f;
245 it.out[1] = dummy + 2.0f;
246 it.out[2] = dummy + 3.0f;
247 it.out[3] = dummy + 4.0f;
252 EXPECT_NEAR(
out[0], dummy + 1.0f, FLT_EPSILON);
253 EXPECT_NEAR(
out[1], dummy + 2.0f, FLT_EPSILON);
254 EXPECT_NEAR(
out[2], dummy + 3.0f, FLT_EPSILON);
255 EXPECT_NEAR(
out[3], dummy + 4.0f, FLT_EPSILON);
261 set_inputs_enabled(
true);
265 for (; !it.is_end(); ++it) {
266 const float *in1 = it.in(0);
267 const float *in2 = it.in(1);
268 it.out[0] = in1[0] + in2[0];
269 it.out[1] = in1[1] + in2[3];
270 it.out[2] = in1[2] - in2[2];
271 it.out[3] = in1[3] - in2[1];
275 const float *in1 = ins[0];
276 const float *in2 = ins[1];
277 EXPECT_NEAR(
out[0], in1[0] + in2[0], FLT_EPSILON);
278 EXPECT_NEAR(
out[1], in1[1] + in2[3], FLT_EPSILON);
279 EXPECT_NEAR(
out[2], in1[2] - in2[2], FLT_EPSILON);
280 EXPECT_NEAR(
out[3], in1[3] - in2[1], FLT_EPSILON);
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
void BLI_rcti_init(struct rcti *rect, int xmin, int xmax, int ymin, int ymax)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
void set_inputs_enabled(bool value)
static void TearDownTestCase()
void test_iteration(IterFunc iter_func, ValidateElemFunc validate_elem_func={})
static void SetUpTestCase()
SyclQueue void void size_t num_bytes void
ccl_global KernelShaderEvalInput * input
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
constexpr int BUFFER_OFFSET_Y
std::function< void(BuffersIterator< float > &it, const rcti &area)> IterFunc
constexpr int BUFFER_HEIGHT
constexpr int NUM_CHANNELS
constexpr int BUFFER_WIDTH
constexpr int FULL_BUFFER_LEN
TEST_F(BuffersIteratorTest, CoordinatesIterationWithNoInputs)
constexpr int SINGLE_ELEM_BUFFER_LEN
static void iterate_coordinates(BuffersIterator< float > &it, const rcti &area)
static const float * create_input_buffer(int input_idx, bool is_a_single_elem)
std::function< void(float *out, Span< const float * > ins, int x, int y)> ValidateElemFunc
constexpr int BUFFER_OFFSET_X
static float * create_buffer(int len)
static void area(int d1, int d2, int e1, int e2, float weights[2])
typename BuffersIteratorBuilder< T >::Iterator BuffersIterator
static const pxr::TfToken out("out", pxr::TfToken::Immortal)
static bNodeSocketTemplate inputs[]