[Bf-blender-cvs] [82c0dbe793f] temp-image-buffer-rasterizer: Fix incorrect buffer operations.
Jeroen Bakker
noreply at git.blender.org
Wed Mar 2 10:14:29 CET 2022
Commit: 82c0dbe793f3cebc18d570086e8442ec7a8bbd3d
Author: Jeroen Bakker
Date: Wed Mar 2 10:14:13 2022 +0100
Branches: temp-image-buffer-rasterizer
https://developer.blender.org/rB82c0dbe793f3cebc18d570086e8442ec7a8bbd3d
Fix incorrect buffer operations.
===================================================================
M source/blender/imbuf/IMB_rasterizer.hh
M source/blender/imbuf/intern/rasterizer_test.cc
===================================================================
diff --git a/source/blender/imbuf/IMB_rasterizer.hh b/source/blender/imbuf/IMB_rasterizer.hh
index 6a07a0a20d7..95f86c7e518 100644
--- a/source/blender/imbuf/IMB_rasterizer.hh
+++ b/source/blender/imbuf/IMB_rasterizer.hh
@@ -75,7 +75,7 @@
#include <optional>
-#define DEBUG_PRINT
+// #define DEBUG_PRINT
namespace blender::imbuf::rasterizer {
@@ -177,11 +177,11 @@ template<typename FragmentInput, typename FragmentOutput> class AbstractFragment
template<typename FragmentInput> class Rasterline {
public:
/** Row where this rasterline will be rendered. */
- uint32_t y;
+ uint32_t y = 0;
/** Starting X coordinate of the rasterline. */
- uint32_t start_x;
+ uint32_t start_x = 0;
/** Ending X coordinate of the rasterline. */
- uint32_t end_x;
+ uint32_t end_x = 0;
/** Input data for the fragment shader on (start_x, y). */
FragmentInput start_data;
/** Delta to add to the start_input to create the data for the next fragment. */
@@ -200,10 +200,11 @@ template<typename FragmentInput> class Rasterline {
template<typename Rasterline, int64_t BufferSize> class Rasterlines {
public:
- Vector<Rasterline> buffer;
+ Vector<Rasterline, BufferSize> buffer;
- explicit Rasterlines() : buffer(BufferSize)
+ explicit Rasterlines()
{
+ buffer.reserve(BufferSize);
}
virtual ~Rasterlines() = default;
@@ -211,6 +212,7 @@ template<typename Rasterline, int64_t BufferSize> class Rasterlines {
void append(const Rasterline &value)
{
buffer.append(value);
+ BLI_assert(buffer.capacity() == BufferSize);
}
bool is_empty() const
@@ -231,6 +233,8 @@ template<typename Rasterline, int64_t BufferSize> class Rasterlines {
void clear()
{
buffer.clear();
+ BLI_assert(buffer.size() == 0);
+ BLI_assert(buffer.capacity() == BufferSize);
}
};
@@ -635,7 +639,6 @@ class Rasterizer {
void render_rasterline(const RasterlineType &rasterline)
{
FragmentInputType data = rasterline.start_data;
- printf("%u, %u\n", rasterline.start_x, rasterline.end_x);
for (uint32_t x = rasterline.start_x; x < rasterline.end_x; x++) {
uint32_t pixel_index = (rasterline.y * image_buffer_->x + x);
float *pixel_ptr = &image_buffer_->rect_float[pixel_index * 4];
diff --git a/source/blender/imbuf/intern/rasterizer_test.cc b/source/blender/imbuf/intern/rasterizer_test.cc
index e3ee6ffadce..d96e4b199f5 100644
--- a/source/blender/imbuf/intern/rasterizer_test.cc
+++ b/source/blender/imbuf/intern/rasterizer_test.cc
@@ -53,7 +53,6 @@ TEST(imbuf_rasterizer, draw_triangle_edge_alignment_quality)
vertex_shader.image_size = float2(image_buffer.x, image_buffer.y);
float clear_color[4] = {0.0f, 0.0f, 0.0f, 0.0f};
- char file_name[FILE_MAX];
float3 location(0.5, 0.5, 0.0);
float3 rotation(0.0, 0.0, 0.0);
@@ -62,7 +61,6 @@ TEST(imbuf_rasterizer, draw_triangle_edge_alignment_quality)
for (int i = 0; i < 1000; i++) {
rasterizer.stats.reset();
- BLI_path_sequence_encode(file_name, "/tmp/test_", ".png", 4, i);
IMB_rectfill(&image_buffer, clear_color);
rotation[2] = (i / 1000.0) * M_PI * 2;
@@ -77,16 +75,15 @@ TEST(imbuf_rasterizer, draw_triangle_edge_alignment_quality)
rasterizer.flush();
/* Check if each pixel has been drawn exactly once. */
- if (rasterizer.stats.drawn_fragments != IMBUF_SIZE * IMBUF_SIZE) {
- printf("%s\n", file_name);
- }
- EXPECT_EQ(rasterizer.stats.drawn_fragments, IMBUF_SIZE * IMBUF_SIZE);
+ EXPECT_EQ(rasterizer.stats.drawn_fragments, IMBUF_SIZE * IMBUF_SIZE) << i;
-#if 0
+#ifdef DEBUG_SAVE
+ char file_name[FILE_MAX];
+ BLI_path_sequence_encode(file_name, "/tmp/test_", ".png", 4, i);
IMB_saveiff(&image_buffer, file_name, IB_rectfloat);
+ imb_freerectImBuf(&image_buffer);
#endif
- imb_freerectImBuf(&image_buffer);
}
imb_freerectImbuf_all(&image_buffer);
@@ -110,7 +107,6 @@ TEST(imbuf_rasterizer, edge_pixel_clamping)
int fragments_drawn_c;
{
- printf("a\n");
IMB_initImBuf(&image_buffer_a, IMBUF_SIZE, IMBUF_SIZE, 32, IB_rectfloat);
RasterizerType rasterizer_a(&image_buffer_a);
@@ -125,7 +121,6 @@ TEST(imbuf_rasterizer, edge_pixel_clamping)
fragments_drawn_a = rasterizer_a.stats.drawn_fragments;
}
{
- printf("b\n");
IMB_initImBuf(&image_buffer_b, IMBUF_SIZE, IMBUF_SIZE, 32, IB_rectfloat);
RasterizerType rasterizer_b(&image_buffer_b);
@@ -141,7 +136,6 @@ TEST(imbuf_rasterizer, edge_pixel_clamping)
}
{
- printf("c\n");
IMB_initImBuf(&image_buffer_c, IMBUF_SIZE, IMBUF_SIZE, 32, IB_rectfloat);
RasterizerType rasterizer_c(&image_buffer_c);
@@ -156,19 +150,16 @@ TEST(imbuf_rasterizer, edge_pixel_clamping)
fragments_drawn_c = rasterizer_c.stats.drawn_fragments;
}
- printf("ab\n");
EXPECT_EQ(fragments_drawn_a, fragments_drawn_b);
EXPECT_EQ(memcmp(image_buffer_a.rect_float,
image_buffer_b.rect_float,
sizeof(float) * 4 * IMBUF_SIZE * IMBUF_SIZE),
0);
- printf("ac\n");
EXPECT_EQ(fragments_drawn_a, fragments_drawn_c);
EXPECT_EQ(memcmp(image_buffer_a.rect_float,
image_buffer_c.rect_float,
sizeof(float) * 4 * IMBUF_SIZE * IMBUF_SIZE),
0);
- printf("bc\n");
EXPECT_EQ(fragments_drawn_b, fragments_drawn_c);
EXPECT_EQ(memcmp(image_buffer_b.rect_float,
image_buffer_c.rect_float,
More information about the Bf-blender-cvs
mailing list