Merging r50522 through r50572 from trunk into soc-2011-tomato
[blender.git] / source / blender / compositor / intern / COM_NodeOperation.cpp
index d439f5b77fe74c4916603bbb4fab2d689dcb62f3..4ae114bd0315145c4a443713cddc41ec60331f02 100644 (file)
 #include "COM_SocketConnection.h"
 #include "COM_defines.h"
 
-NodeOperation::NodeOperation()
+NodeOperation::NodeOperation() : NodeBase()
 {
-       this->resolutionInputSocketIndex = 0;
-       this->complex = false;
-       this->width = 0;
-       this->height = 0;
-       this->openCL = false;
-       this->btree = NULL;
+       this->m_resolutionInputSocketIndex = 0;
+       this->m_complex = false;
+       this->m_width = 0;
+       this->m_height = 0;
+       this->m_openCL = false;
+       this->m_btree = NULL;
 }
 
-void NodeOperation::determineResolution(unsigned int resolution[], unsigned int preferredResolution[])
+void NodeOperation::determineResolution(unsigned int resolution[2], unsigned int preferredResolution[2])
 {
        unsigned int temp[2];
        unsigned int temp2[2];
@@ -47,7 +47,7 @@ void NodeOperation::determineResolution(unsigned int resolution[], unsigned int
        for (unsigned int index = 0; index < inputsockets.size(); index++) {
                InputSocket *inputSocket = inputsockets[index];
                if (inputSocket->isConnected()) {
-                       if (index == this->resolutionInputSocketIndex) {
+                       if (index == this->m_resolutionInputSocketIndex) {
                                inputSocket->determineResolution(resolution, preferredResolution);
                                temp2[0] = resolution[0];
                                temp2[1] = resolution[1];
@@ -58,7 +58,7 @@ void NodeOperation::determineResolution(unsigned int resolution[], unsigned int
        for (unsigned int index = 0; index < inputsockets.size(); index++) {
                InputSocket *inputSocket = inputsockets[index];
                if (inputSocket->isConnected()) {
-                       if (index != resolutionInputSocketIndex) {
+                       if (index != this->m_resolutionInputSocketIndex) {
                                inputSocket->determineResolution(temp, temp2);
                        }
                }
@@ -66,7 +66,7 @@ void NodeOperation::determineResolution(unsigned int resolution[], unsigned int
 }
 void NodeOperation::setResolutionInputSocketIndex(unsigned int index)
 {
-       this->resolutionInputSocketIndex = index;
+       this->m_resolutionInputSocketIndex = index;
 }
 void NodeOperation::initExecution()
 {
@@ -75,22 +75,22 @@ void NodeOperation::initExecution()
 
 void NodeOperation::initMutex()
 {
-       BLI_mutex_init(&mutex);
+       BLI_mutex_init(&this->m_mutex);
 }
 
 void NodeOperation::lockMutex()
 {
-       BLI_mutex_lock(&mutex);
+       BLI_mutex_lock(&this->m_mutex);
 }
 
 void NodeOperation::unlockMutex()
 {
-       BLI_mutex_unlock(&mutex);
+       BLI_mutex_unlock(&this->m_mutex);
 }
 
 void NodeOperation::deinitMutex()
 {
-       BLI_mutex_end(&mutex);
+       BLI_mutex_end(&this->m_mutex);
 }
 
 void NodeOperation::deinitExecution()
@@ -120,138 +120,30 @@ void NodeOperation::getConnectedInputSockets(vector<InputSocket *> *sockets)
 bool NodeOperation::determineDependingAreaOfInterest(rcti *input, ReadBufferOperation *readOperation, rcti *output)
 {
        if (this->isInputNode()) {
-               BLI_init_rcti(output, input->xmin, input->xmax, input->ymin, input->ymax);
+               BLI_rcti_init(output, input->xmin, input->xmax, input->ymin, input->ymax);
                return false;
        }
        else {
-               unsigned int index;
-               vector<InputSocket *> &inputsockets = this->getInputSockets();
-       
-               for (index = 0; index < inputsockets.size(); index++) {
-                       InputSocket *inputsocket = inputsockets[index];
-                       if (inputsocket->isConnected()) {
-                               NodeOperation *inputoperation = (NodeOperation *)inputsocket->getConnection()->getFromNode();
-                               bool result = inputoperation->determineDependingAreaOfInterest(input, readOperation, output);
-                               if (result) {
-                                       return true;
+               rcti tempOutput;
+               bool first = true;
+               for (int i = 0 ; i < getNumberOfInputSockets() ; i ++) {
+                       NodeOperation * inputOperation = this->getInputOperation(i);
+                       if (inputOperation && inputOperation->determineDependingAreaOfInterest(input, readOperation, &tempOutput)) {
+                               if (first) {
+                                       output->xmin = tempOutput.xmin;
+                                       output->ymin = tempOutput.ymin;
+                                       output->xmax = tempOutput.xmax;
+                                       output->ymax = tempOutput.ymax;
+                                       first = false;
+                               }
+                               else {
+                                       output->xmin = MIN2(output->xmin, tempOutput.xmin);
+                                       output->ymin = MIN2(output->ymin, tempOutput.ymin);
+                                       output->xmax = MAX2(output->xmax, tempOutput.xmax);
+                                       output->ymax = MAX2(output->ymax, tempOutput.ymax);
                                }
                        }
                }
-               return false;
-       }
-}
-
-cl_mem NodeOperation::COM_clAttachMemoryBufferToKernelParameter(cl_context context, cl_kernel kernel, int parameterIndex, int offsetIndex, list<cl_mem> *cleanup, MemoryBuffer **inputMemoryBuffers, SocketReader *reader)
-{
-       cl_int error;
-       MemoryBuffer *result = (MemoryBuffer *)reader->initializeTileData(NULL, inputMemoryBuffers);
-
-       const cl_image_format imageFormat = {
-               CL_RGBA,
-               CL_FLOAT
-       };
-
-       cl_mem clBuffer = clCreateImage2D(context, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, &imageFormat, result->getWidth(),
-                                         result->getHeight(), 0, result->getBuffer(), &error);
-       
-       if (error != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error));  }
-       if (error == CL_SUCCESS) cleanup->push_back(clBuffer);
-
-       error = clSetKernelArg(kernel, parameterIndex, sizeof(cl_mem), &clBuffer);
-       if (error != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error));  }
-       
-       COM_clAttachMemoryBufferOffsetToKernelParameter(kernel, offsetIndex, result);
-       return clBuffer;
-}
-       
-void NodeOperation::COM_clAttachMemoryBufferOffsetToKernelParameter(cl_kernel kernel, int offsetIndex, MemoryBuffer *memoryBuffer) 
-{
-       if (offsetIndex != -1) {
-               cl_int error;
-               rcti *rect = memoryBuffer->getRect();
-               cl_int2 offset = {rect->xmin, rect->ymin};
-
-               error = clSetKernelArg(kernel, offsetIndex, sizeof(cl_int2), &offset);
-               if (error != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error));  }
-       }
-}
-
-void NodeOperation::COM_clAttachSizeToKernelParameter(cl_kernel kernel, int offsetIndex) 
-{
-       if (offsetIndex != -1) {
-               cl_int error;
-               cl_int2 offset = {this->getWidth(), this->getHeight()};
-
-               error = clSetKernelArg(kernel, offsetIndex, sizeof(cl_int2), &offset);
-               if (error != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error));  }
-       }
-}
-
-void NodeOperation::COM_clAttachOutputMemoryBufferToKernelParameter(cl_kernel kernel, int parameterIndex, cl_mem clOutputMemoryBuffer) 
-{
-       cl_int error;
-       error = clSetKernelArg(kernel, parameterIndex, sizeof(cl_mem), &clOutputMemoryBuffer);
-       if (error != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); }
-}
-
-void NodeOperation::COM_clEnqueueRange(cl_command_queue queue, cl_kernel kernel, MemoryBuffer *outputMemoryBuffer)
-{
-       cl_int error;
-       const size_t size[] = {outputMemoryBuffer->getWidth(), outputMemoryBuffer->getHeight()};
-       
-       error = clEnqueueNDRangeKernel(queue, kernel, 2, NULL, size, 0, 0, 0, NULL);
-       if (error != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error));  }
-}
-
-void NodeOperation::COM_clEnqueueRange(cl_command_queue queue, cl_kernel kernel, MemoryBuffer *outputMemoryBuffer, int offsetIndex)
-{
-       cl_int error;
-       const int width = outputMemoryBuffer->getWidth();
-       const int height = outputMemoryBuffer->getHeight();
-       int offsetx;
-       int offsety;
-       const int localSize = 128;
-       size_t size[2];
-       cl_int2 offset;
-       
-       bool breaked = false;
-       for (offsety = 0; offsety < height && (!breaked); offsety += localSize) {
-               offset[1] = offsety;
-               if (offsety + localSize < height) {
-                       size[1] = localSize;
-               }
-               else {
-                       size[1] = height - offsety;
-               }
-               for (offsetx = 0; offsetx < width && (!breaked); offsetx += localSize) {
-                       if (offsetx + localSize < width) {
-                               size[0] = localSize;
-                       }
-                       else {
-                               size[0] = width - offsetx;
-                       }
-                       offset[0] = offsetx;
-
-                       error = clSetKernelArg(kernel, offsetIndex, sizeof(cl_int2), &offset);
-                       if (error != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); }
-                       error = clEnqueueNDRangeKernel(queue, kernel, 2, NULL, size, 0, 0, 0, NULL);
-                       if (error != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error));  }
-                       clFlush(queue);
-                       if (isBreaked()) {
-                               breaked = false;
-                       }
-               }
+               return !first;
        }
 }
-
-cl_kernel NodeOperation::COM_clCreateKernel(cl_program program, const char *kernelname, list<cl_kernel> *clKernelsToCleanUp) 
-{
-       cl_int error;
-       cl_kernel kernel = clCreateKernel(program, kernelname, &error);
-       if (error != CL_SUCCESS) { printf("CLERROR[%d]: %s\n", error, clewErrorString(error)); }
-       else {
-               if (clKernelsToCleanUp) clKernelsToCleanUp->push_back(kernel);
-       }
-       return kernel;
-       
-}