Differential D12465 Diff 41723 source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cc
Changeset View
Changeset View
Standalone View
Standalone View
source/blender/compositor/operations/COM_VariableSizeBokehBlurOperation.cc
| Show First 20 Lines • Show All 71 Lines • ▼ Show 20 Lines | void *VariableSizeBokehBlurOperation::initializeTileData(rcti *rect) | ||||
| data->color = (MemoryBuffer *)this->m_inputProgram->initializeTileData(rect); | data->color = (MemoryBuffer *)this->m_inputProgram->initializeTileData(rect); | ||||
| data->bokeh = (MemoryBuffer *)this->m_inputBokehProgram->initializeTileData(rect); | data->bokeh = (MemoryBuffer *)this->m_inputBokehProgram->initializeTileData(rect); | ||||
| data->size = (MemoryBuffer *)this->m_inputSizeProgram->initializeTileData(rect); | data->size = (MemoryBuffer *)this->m_inputSizeProgram->initializeTileData(rect); | ||||
| rcti rect2; | rcti rect2; | ||||
| this->determineDependingAreaOfInterest( | this->determineDependingAreaOfInterest( | ||||
| rect, (ReadBufferOperation *)this->m_inputSizeProgram, &rect2); | rect, (ReadBufferOperation *)this->m_inputSizeProgram, &rect2); | ||||
| const float max_dim = MAX2(m_width, m_height); | const float max_dim = MAX2(this->getWidth(), this->getHeight()); | ||||
| const float scalar = this->m_do_size_scale ? (max_dim / 100.0f) : 1.0f; | const float scalar = this->m_do_size_scale ? (max_dim / 100.0f) : 1.0f; | ||||
| data->maxBlurScalar = (int)(data->size->get_max_value(rect2) * scalar); | data->maxBlurScalar = (int)(data->size->get_max_value(rect2) * scalar); | ||||
| CLAMP(data->maxBlurScalar, 1.0f, this->m_maxBlur); | CLAMP(data->maxBlurScalar, 1.0f, this->m_maxBlur); | ||||
| return data; | return data; | ||||
| } | } | ||||
| void VariableSizeBokehBlurOperation::deinitializeTileData(rcti * /*rect*/, void *data) | void VariableSizeBokehBlurOperation::deinitializeTileData(rcti * /*rect*/, void *data) | ||||
| Show All 11 Lines | void VariableSizeBokehBlurOperation::executePixel(float output[4], int x, int y, void *data) | ||||
| float *inputSizeFloatBuffer = inputSizeBuffer->getBuffer(); | float *inputSizeFloatBuffer = inputSizeBuffer->getBuffer(); | ||||
| float *inputProgramFloatBuffer = inputProgramBuffer->getBuffer(); | float *inputProgramFloatBuffer = inputProgramBuffer->getBuffer(); | ||||
| float readColor[4]; | float readColor[4]; | ||||
| float bokeh[4]; | float bokeh[4]; | ||||
| float tempSize[4]; | float tempSize[4]; | ||||
| float multiplier_accum[4]; | float multiplier_accum[4]; | ||||
| float color_accum[4]; | float color_accum[4]; | ||||
| const float max_dim = MAX2(m_width, m_height); | const float max_dim = MAX2(getWidth(), getHeight()); | ||||
| const float scalar = this->m_do_size_scale ? (max_dim / 100.0f) : 1.0f; | const float scalar = this->m_do_size_scale ? (max_dim / 100.0f) : 1.0f; | ||||
| int maxBlurScalar = tileData->maxBlurScalar; | int maxBlurScalar = tileData->maxBlurScalar; | ||||
| BLI_assert(inputBokehBuffer->getWidth() == COM_BLUR_BOKEH_PIXELS); | BLI_assert(inputBokehBuffer->getWidth() == COM_BLUR_BOKEH_PIXELS); | ||||
| BLI_assert(inputBokehBuffer->getHeight() == COM_BLUR_BOKEH_PIXELS); | BLI_assert(inputBokehBuffer->getHeight() == COM_BLUR_BOKEH_PIXELS); | ||||
| #ifdef COM_DEFOCUS_SEARCH | #ifdef COM_DEFOCUS_SEARCH | ||||
| float search[4]; | float search[4]; | ||||
| this->m_inputSearchProgram->read(search, | this->m_inputSearchProgram->read(search, | ||||
| x / InverseSearchRadiusOperation::DIVIDER, | x / InverseSearchRadiusOperation::DIVIDER, | ||||
| y / InverseSearchRadiusOperation::DIVIDER, | y / InverseSearchRadiusOperation::DIVIDER, | ||||
| nullptr); | nullptr); | ||||
| int minx = search[0]; | int minx = search[0]; | ||||
| int miny = search[1]; | int miny = search[1]; | ||||
| int maxx = search[2]; | int maxx = search[2]; | ||||
| int maxy = search[3]; | int maxy = search[3]; | ||||
| #else | #else | ||||
| int minx = MAX2(x - maxBlurScalar, 0); | int minx = MAX2(x - maxBlurScalar, 0); | ||||
| int miny = MAX2(y - maxBlurScalar, 0); | int miny = MAX2(y - maxBlurScalar, 0); | ||||
| int maxx = MIN2(x + maxBlurScalar, (int)m_width); | int maxx = MIN2(x + maxBlurScalar, (int)getWidth()); | ||||
| int maxy = MIN2(y + maxBlurScalar, (int)m_height); | int maxy = MIN2(y + maxBlurScalar, (int)getHeight()); | ||||
| #endif | #endif | ||||
| { | { | ||||
| inputSizeBuffer->readNoCheck(tempSize, x, y); | inputSizeBuffer->readNoCheck(tempSize, x, y); | ||||
| inputProgramBuffer->readNoCheck(readColor, x, y); | inputProgramBuffer->readNoCheck(readColor, x, y); | ||||
| copy_v4_v4(color_accum, readColor); | copy_v4_v4(color_accum, readColor); | ||||
| copy_v4_fl(multiplier_accum, 1.0f); | copy_v4_fl(multiplier_accum, 1.0f); | ||||
| float size_center = tempSize[0] * scalar; | float size_center = tempSize[0] * scalar; | ||||
| ▲ Show 20 Lines • Show All 57 Lines • ▼ Show 20 Lines | void VariableSizeBokehBlurOperation::executeOpenCL(OpenCLDevice *device, | ||||
| cl_int step = this->getStep(); | cl_int step = this->getStep(); | ||||
| cl_int maxBlur; | cl_int maxBlur; | ||||
| cl_float threshold = this->m_threshold; | cl_float threshold = this->m_threshold; | ||||
| MemoryBuffer *sizeMemoryBuffer = this->m_inputSizeProgram->getInputMemoryBuffer( | MemoryBuffer *sizeMemoryBuffer = this->m_inputSizeProgram->getInputMemoryBuffer( | ||||
| inputMemoryBuffers); | inputMemoryBuffers); | ||||
| const float max_dim = MAX2(m_width, m_height); | const float max_dim = MAX2(getWidth(), getHeight()); | ||||
| cl_float scalar = this->m_do_size_scale ? (max_dim / 100.0f) : 1.0f; | cl_float scalar = this->m_do_size_scale ? (max_dim / 100.0f) : 1.0f; | ||||
| maxBlur = (cl_int)min_ff(sizeMemoryBuffer->get_max_value() * scalar, (float)this->m_maxBlur); | maxBlur = (cl_int)min_ff(sizeMemoryBuffer->get_max_value() * scalar, (float)this->m_maxBlur); | ||||
| device->COM_clAttachMemoryBufferToKernelParameter( | device->COM_clAttachMemoryBufferToKernelParameter( | ||||
| defocusKernel, 0, -1, clMemToCleanUp, inputMemoryBuffers, this->m_inputProgram); | defocusKernel, 0, -1, clMemToCleanUp, inputMemoryBuffers, this->m_inputProgram); | ||||
| device->COM_clAttachMemoryBufferToKernelParameter( | device->COM_clAttachMemoryBufferToKernelParameter( | ||||
| defocusKernel, 1, -1, clMemToCleanUp, inputMemoryBuffers, this->m_inputBokehProgram); | defocusKernel, 1, -1, clMemToCleanUp, inputMemoryBuffers, this->m_inputBokehProgram); | ||||
| Show All 21 Lines | |||||
| } | } | ||||
| bool VariableSizeBokehBlurOperation::determineDependingAreaOfInterest( | bool VariableSizeBokehBlurOperation::determineDependingAreaOfInterest( | ||||
| rcti *input, ReadBufferOperation *readOperation, rcti *output) | rcti *input, ReadBufferOperation *readOperation, rcti *output) | ||||
| { | { | ||||
| rcti newInput; | rcti newInput; | ||||
| rcti bokehInput; | rcti bokehInput; | ||||
| const float max_dim = MAX2(m_width, m_height); | const float max_dim = MAX2(getWidth(), getHeight()); | ||||
| const float scalar = this->m_do_size_scale ? (max_dim / 100.0f) : 1.0f; | const float scalar = this->m_do_size_scale ? (max_dim / 100.0f) : 1.0f; | ||||
| int maxBlurScalar = this->m_maxBlur * scalar; | int maxBlurScalar = this->m_maxBlur * scalar; | ||||
| newInput.xmax = input->xmax + maxBlurScalar + 2; | newInput.xmax = input->xmax + maxBlurScalar + 2; | ||||
| newInput.xmin = input->xmin - maxBlurScalar + 2; | newInput.xmin = input->xmin - maxBlurScalar + 2; | ||||
| newInput.ymax = input->ymax + maxBlurScalar - 2; | newInput.ymax = input->ymax + maxBlurScalar - 2; | ||||
| newInput.ymin = input->ymin - maxBlurScalar - 2; | newInput.ymin = input->ymin - maxBlurScalar - 2; | ||||
| bokehInput.xmax = COM_BLUR_BOKEH_PIXELS; | bokehInput.xmax = COM_BLUR_BOKEH_PIXELS; | ||||
| Show All 39 Lines | case SIZE_INPUT_INDEX: { | ||||
| const int max_blur_scalar = m_maxBlur * scalar; | const int max_blur_scalar = m_maxBlur * scalar; | ||||
| r_input_area.xmax = output_area.xmax + max_blur_scalar + 2; | r_input_area.xmax = output_area.xmax + max_blur_scalar + 2; | ||||
| r_input_area.xmin = output_area.xmin - max_blur_scalar - 2; | r_input_area.xmin = output_area.xmin - max_blur_scalar - 2; | ||||
| r_input_area.ymax = output_area.ymax + max_blur_scalar + 2; | r_input_area.ymax = output_area.ymax + max_blur_scalar + 2; | ||||
| r_input_area.ymin = output_area.ymin - max_blur_scalar - 2; | r_input_area.ymin = output_area.ymin - max_blur_scalar - 2; | ||||
| break; | break; | ||||
| } | } | ||||
| case BOKEH_INPUT_INDEX: { | case BOKEH_INPUT_INDEX: { | ||||
| r_input_area.xmax = COM_BLUR_BOKEH_PIXELS; | r_input_area = output_area; | ||||
| r_input_area.xmin = 0; | r_input_area.xmax = r_input_area.xmin + COM_BLUR_BOKEH_PIXELS; | ||||
| r_input_area.ymax = COM_BLUR_BOKEH_PIXELS; | r_input_area.ymax = r_input_area.ymin + COM_BLUR_BOKEH_PIXELS; | ||||
| r_input_area.ymin = 0; | |||||
| break; | break; | ||||
| } | } | ||||
| #ifdef COM_DEFOCUS_SEARCH | #ifdef COM_DEFOCUS_SEARCH | ||||
| case DEFOCUS_INPUT_INDEX: { | case DEFOCUS_INPUT_INDEX: { | ||||
| r_input_area.xmax = (output_area.xmax / InverseSearchRadiusOperation::DIVIDER) + 1; | r_input_area.xmax = (output_area.xmax / InverseSearchRadiusOperation::DIVIDER) + 1; | ||||
| r_input_area.xmin = (output_area.xmin / InverseSearchRadiusOperation::DIVIDER) - 1; | r_input_area.xmin = (output_area.xmin / InverseSearchRadiusOperation::DIVIDER) - 1; | ||||
| r_input_area.ymax = (output_area.ymax / InverseSearchRadiusOperation::DIVIDER) + 1; | r_input_area.ymax = (output_area.ymax / InverseSearchRadiusOperation::DIVIDER) + 1; | ||||
| r_input_area.ymin = (output_area.ymin / InverseSearchRadiusOperation::DIVIDER) - 1; | r_input_area.ymin = (output_area.ymin / InverseSearchRadiusOperation::DIVIDER) - 1; | ||||
| ▲ Show 20 Lines • Show All 242 Lines • Show Last 20 Lines | |||||