[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