Commit: 1607bcebc65fd5296f9f695e76580a1ae7ade9a2
Author: Dalai Felinto
Date:   Mon Jul 28 16:43:32 2014 -0300
Branches: testbuild
https://developer.blender.org/rB1607bcebc65fd5296f9f695e76580a1ae7ade9a2

Bake-API: use size_t instead of width, height

* Original patch by Sergey Sharybin
* Current patch includes function to estimate a width/height when baking into 
multiple images

Attempt to Fix T41222 Blender gives weird ouput when baking (4096*4096) 
resolution on GPU

Reviewers: sergey

Subscribers: RadiationG0D

Maniphest Tasks: T41222

Differential Revision: https://developer.blender.org/D688

===================================================================

M       intern/cycles/blender/addon/__init__.py
M       intern/cycles/blender/addon/engine.py
M       intern/cycles/blender/blender_python.cpp
M       intern/cycles/blender/blender_session.cpp
M       intern/cycles/blender/blender_session.h
M       intern/cycles/render/bake.cpp
M       intern/cycles/render/bake.h
M       source/blender/editors/object/object_bake_api.c
M       source/blender/makesrna/intern/rna_render.c
M       source/blender/render/extern/include/RE_bake.h
M       source/blender/render/extern/include/RE_engine.h
M       source/blender/render/intern/source/bake_api.c
M       source/blender/render/intern/source/external_engine.c

===================================================================

diff --git a/intern/cycles/blender/addon/__init__.py 
b/intern/cycles/blender/addon/__init__.py
index 27d9869..44ffdc4 100644
--- a/intern/cycles/blender/addon/__init__.py
+++ b/intern/cycles/blender/addon/__init__.py
@@ -67,8 +67,8 @@ class CyclesRender(bpy.types.RenderEngine):
     def render(self, scene):
         engine.render(self)
 
-    def bake(self, scene, obj, pass_type, pixel_array, num_pixels, depth, 
result):
-        engine.bake(self, obj, pass_type, pixel_array, num_pixels, depth, 
result)
+    def bake(self, scene, obj, pass_type, pixel_array, width, height, depth, 
result):
+        engine.bake(self, obj, pass_type, pixel_array, width, height, depth, 
result)
 
     # viewport render
     def view_update(self, context):
diff --git a/intern/cycles/blender/addon/engine.py 
b/intern/cycles/blender/addon/engine.py
index 18235ec..ca14bfe 100644
--- a/intern/cycles/blender/addon/engine.py
+++ b/intern/cycles/blender/addon/engine.py
@@ -59,11 +59,11 @@ def render(engine):
         _cycles.render(engine.session)
 
 
-def bake(engine, obj, pass_type, pixel_array, num_pixels, depth, result):
+def bake(engine, obj, pass_type, pixel_array, width, height, depth, result):
     import _cycles
     session = getattr(engine, "session", None)
     if session is not None:
-        _cycles.bake(engine.session, obj.as_pointer(), pass_type, 
pixel_array.as_pointer(), num_pixels, depth, result.as_pointer())
+        _cycles.bake(engine.session, obj.as_pointer(), pass_type, 
pixel_array.as_pointer(), width, height, depth, result.as_pointer())
 
 
 def reset(engine, data, scene):
diff --git a/intern/cycles/blender/blender_python.cpp 
b/intern/cycles/blender/blender_python.cpp
index 1d18f56..e89043e 100644
--- a/intern/cycles/blender/blender_python.cpp
+++ b/intern/cycles/blender/blender_python.cpp
@@ -160,9 +160,9 @@ static PyObject *bake_func(PyObject *self, PyObject *args)
        PyObject *pysession, *pyobject;
        PyObject *pypixel_array, *pyresult;
        const char *pass_type;
-       int num_pixels, depth;
+       int width, height, depth;
 
-       if(!PyArg_ParseTuple(args, "OOsOiiO", &pysession, &pyobject, 
&pass_type, &pypixel_array,  &num_pixels, &depth, &pyresult))
+       if(!PyArg_ParseTuple(args, "OOsOiiiO", &pysession, &pyobject, 
&pass_type, &pypixel_array, &width, &height, &depth, &pyresult))
                return NULL;
 
        BlenderSession *session = (BlenderSession*)PyLong_AsVoidPtr(pysession);
@@ -179,7 +179,7 @@ static PyObject *bake_func(PyObject *self, PyObject *args)
 
        python_thread_state_save(&session->python_thread_state);
 
-       session->bake(b_object, pass_type, b_bake_pixel, num_pixels, depth, 
(float *)b_result);
+       session->bake(b_object, pass_type, b_bake_pixel, width, height, depth, 
(float *)b_result);
 
        python_thread_state_restore(&session->python_thread_state);
 
diff --git a/intern/cycles/blender/blender_session.cpp 
b/intern/cycles/blender/blender_session.cpp
index e57a672..57d0f5b 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -481,22 +481,23 @@ void BlenderSession::render()
        sync = NULL;
 }
 
-static void populate_bake_data(BakeData *data, BL::BakePixel pixel_array, 
const int num_pixels)
+static void populate_bake_data(BakeData *data, BL::BakePixel pixel_array, 
const size_t num_pixels)
 {
        BL::BakePixel bp = pixel_array;
 
-       int i;
+       size_t i;
        for(i=0; i < num_pixels; i++) {
                data->set(i, bp.primitive_id(), bp.uv(), bp.du_dx(), 
bp.du_dy(), bp.dv_dx(), bp.dv_dy());
                bp = bp.next();
        }
 }
 
-void BlenderSession::bake(BL::Object b_object, const string& pass_type, 
BL::BakePixel pixel_array, int num_pixels, int depth, float result[])
+void BlenderSession::bake(BL::Object b_object, const string& pass_type, 
BL::BakePixel pixel_array, int width, int height, int depth, float result[])
 {
        ShaderEvalType shader_type = get_shader_type(pass_type);
        size_t object_index = OBJECT_NONE;
        int tri_offset = 0;
+       const size_t num_pixels = width * height;
 
        /* ensure kernels are loaded before we do any scene updates */
        session->load_kernels();
diff --git a/intern/cycles/blender/blender_session.h 
b/intern/cycles/blender/blender_session.h
index 5146483..c936b3b 100644
--- a/intern/cycles/blender/blender_session.h
+++ b/intern/cycles/blender/blender_session.h
@@ -52,7 +52,7 @@ public:
        /* offline render */
        void render();
 
-       void bake(BL::Object b_object, const string& pass_type, BL::BakePixel 
pixel_array, int num_pixels, int depth, float pixels[]);
+       void bake(BL::Object b_object, const string& pass_type, BL::BakePixel 
pixel_array, int width, int height, int depth, float pixels[]);
 
        void write_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, 
RenderTile& rtile);
        void write_render_tile(RenderTile& rtile);
diff --git a/intern/cycles/render/bake.cpp b/intern/cycles/render/bake.cpp
index bc313a5..d7da63d 100644
--- a/intern/cycles/render/bake.cpp
+++ b/intern/cycles/render/bake.cpp
@@ -19,7 +19,7 @@
 
 CCL_NAMESPACE_BEGIN
 
-BakeData::BakeData(const int object, const int tri_offset, const int 
num_pixels):
+BakeData::BakeData(const int object, const size_t tri_offset, const size_t 
num_pixels):
 m_object(object),
 m_tri_offset(tri_offset),
 m_num_pixels(num_pixels)
@@ -60,7 +60,7 @@ int BakeData::object()
        return m_object;
 }
 
-int BakeData::size()
+size_t BakeData::size()
 {
        return m_num_pixels;
 }
@@ -113,7 +113,7 @@ void BakeManager::set_baking(const bool value)
        m_is_baking = value;
 }
 
-BakeData *BakeManager::init(const int object, const int tri_offset, const int 
num_pixels)
+BakeData *BakeManager::init(const int object, const size_t tri_offset, const 
size_t num_pixels)
 {
        m_bake_data = new BakeData(object, tri_offset, num_pixels);
        return m_bake_data;
diff --git a/intern/cycles/render/bake.h b/intern/cycles/render/bake.h
index bf03a16..652420c 100644
--- a/intern/cycles/render/bake.h
+++ b/intern/cycles/render/bake.h
@@ -27,20 +27,20 @@ CCL_NAMESPACE_BEGIN
 
 class BakeData {
 public:
-       BakeData(const int object, const int tri_offset, const int num_pixels);
+       BakeData(const int object, const size_t tri_offset, const size_t 
num_pixels);
        ~BakeData();
 
        void set(int i, int prim, float uv[2], float dudx, float dudy, float 
dvdx, float dvdy);
        int object();
-       int size();
+       size_t size();
        uint4 data(int i);
        uint4 differentials(int i);
        bool is_valid(int i);
 
 private:
        int m_object;
-       int m_tri_offset;
-       int m_num_pixels;
+       size_t m_tri_offset;
+       size_t m_num_pixels;
        vector<int>m_primitive;
        vector<float>m_u;
        vector<float>m_v;
@@ -58,7 +58,7 @@ public:
        bool get_baking();
        void set_baking(const bool value);
 
-       BakeData *init(const int object, const int tri_offset, const int 
num_pixels);
+       BakeData *init(const int object, const size_t tri_offset, const size_t 
num_pixels);
 
        bool bake(Device *device, DeviceScene *dscene, Scene *scene, Progress& 
progress, ShaderEvalType shader_type, BakeData *bake_data, float result[]);
 
diff --git a/source/blender/editors/object/object_bake_api.c 
b/source/blender/editors/object/object_bake_api.c
index c3bb6d9..417dcef 100644
--- a/source/blender/editors/object/object_bake_api.c
+++ b/source/blender/editors/object/object_bake_api.c
@@ -178,7 +178,7 @@ static bool write_internal_bake_pixels(
        void *lock;
        bool is_float;
        char *mask_buffer = NULL;
-       const int num_pixels = width * height;
+       const size_t num_pixels = width * height;
 
        ibuf = BKE_image_acquire_ibuf(image, NULL, &lock);
 
@@ -311,7 +311,7 @@ static bool write_external_bake_pixels(
        /* margins */
        if (margin > 0) {
                char *mask_buffer = NULL;
-               const int num_pixels = width * height;
+               const size_t num_pixels = width * height;
 
                mask_buffer = MEM_callocN(sizeof(char) * num_pixels, "Bake 
Mask");
                RE_bake_mask_fill(pixel_array, num_pixels, mask_buffer);
@@ -514,10 +514,10 @@ static void build_image_lookup(Main *bmain, Object *ob, 
BakeImages *bake_images)
 /*
  * returns the total number of pixels
  */
-static int initialize_internal_images(BakeImages *bake_images, ReportList 
*reports)
+static size_t initialize_internal_images(BakeImages *bake_images, ReportList 
*reports)
 {
        int i;
-       int tot_size = 0;
+       size_t tot_size = 0;
 
        for (i = 0; i < bake_images->size; i++) {
                ImBuf *ibuf;
@@ -543,6 +543,28 @@ static int initialize_internal_images(BakeImages 
*bake_images, ReportList *repor
        return tot_size;
 }
 
+/* returns the image dimensions for single-images baking sessions, or an 
optimal dimension (the closest we can get to the square root) */
+static void calculate_buffer_dimension(int *width, int *height, const size_t 
num_pixels, BakeImages *bake_images)
+{
+       if (bake_images->size == 1) {
+               *width = bake_images->data[0].width;
+               *height = bake_images->data[0].height;
+       }
+       else {
+               int max_dividend = floor(sqrt(num_pixels));
+               BLI_assert(max_dividend > 0);
+
+               while (true) {
+                       if ((num_pixels % max_dividend) == 0) {
+                               *width = max_dividend;
+                               *height = num_pixels / max_dividend;
+                               break;
+                       }
+                       max_dividend--;
+               }
+       }
+}
+
 static int bake(
         Render *re, Main *bmain, Scene *scene, Object *ob_low, ListBase 
*selected_objects, ReportList *reports,
         const ScenePassType pass_type, const int margin,
@@ -576,10 +598,12 @@ static int bake(
 
        BakeImages bake_images = {NULL};
 
-       int num_pixels;
+       size_t num_pixels;
        int tot_materials;
        int i;
 
+       int buffer_width, buffer_height;
+
        RE_bake_engine_set_engine_parameters(re, bmain, scene);
 
        if (!RE_bake_has_engine(re)) {
@@ -649,6 +673,8 @@ static int bake(
                }
        }
 
+       calculate_buffer_dimension(&buffer_width, &buffer_height, num_pixels, 
&bake_images);
+
        if (is_selected_to_active) {
                CollectionPointerLink *link;
                tot_highpoly = 0;
@@ -788,7 +814,7 @@ static int bake(
 
                /* the baking itself */
                for (i = 0; i < tot_highpoly; i++) {
-                       ok = RE_bake_engine(re, highpoly[i].ob, 
highpoly[i].pixel_array, num_pixels,
+                       ok = RE_bake_engine(re, highpoly[i].ob, 
highpoly[i].pixel_array, buffer_width, buffer_height,
                                            depth, pass_type, result);
                        if (!ok) {
                                BKE_reportf(reports, RPT_ERROR, "Error baking 
from object \"%s\"", highpoly[i].ob->id.name + 2);
@@ -815,7 +841,7 @@ cage_cleanup:
                ob_low->restrictflag &= ~OB_RESTRICT_RENDER;
 
                if (RE_bake_has_engine(re))

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to