Changeset View
Changeset View
Standalone View
Standalone View
source/blender/compositor/intern/COM_MemoryBuffer.cc
| Show All 16 Lines | |||||
| */ | */ | ||||
| #include "COM_MemoryBuffer.h" | #include "COM_MemoryBuffer.h" | ||||
| #include "MEM_guardedalloc.h" | #include "MEM_guardedalloc.h" | ||||
| namespace blender::compositor { | namespace blender::compositor { | ||||
| static void set_base_buffer(BaseBuffer *buf, | |||||
| int width, | |||||
| int height, | |||||
| int elem_channels, | |||||
| int elem_stride, | |||||
| size_t channel_bytes, | |||||
| bool is_single_elem) | |||||
| { | |||||
| buf->channel_bytes = channel_bytes; | |||||
| buf->elem_channels = elem_channels; | |||||
| buf->elem_stride = elem_stride; | |||||
| buf->width = width; | |||||
| buf->height = height; | |||||
| buf->is_single_elem = is_single_elem; | |||||
| buf->used_bytes = is_single_elem ? elem_stride * channel_bytes : | |||||
| (size_t)height * width * elem_stride * channel_bytes; | |||||
| buf->total_bytes = buf->used_bytes; | |||||
| if (is_single_elem) { | |||||
| buf->elem_jump = 0; | |||||
| buf->row_jump = 0; | |||||
| } | |||||
| else { | |||||
| buf->elem_jump = elem_stride; | |||||
| buf->row_jump = width * elem_stride; | |||||
| } | |||||
| } | |||||
| MemoryBuffer::MemoryBuffer(MemoryProxy *memoryProxy, const rcti &rect, MemoryBufferState state) | MemoryBuffer::MemoryBuffer(MemoryProxy *memoryProxy, const rcti &rect, MemoryBufferState state) | ||||
| { | { | ||||
| m_rect = rect; | m_rect = rect; | ||||
| this->m_memoryProxy = memoryProxy; | this->m_memoryProxy = memoryProxy; | ||||
| this->m_num_channels = COM_data_type_num_channels(memoryProxy->getDataType()); | this->m_num_channels = COM_data_type_num_channels(memoryProxy->getDataType()); | ||||
| this->m_buffer = (float *)MEM_mallocN_aligned( | this->m_buffer = (float *)MEM_mallocN_aligned( | ||||
| sizeof(float) * buffer_len() * this->m_num_channels, 16, "COM_MemoryBuffer"); | sizeof(float) * buffer_len() * this->m_num_channels, 16, "COM_MemoryBuffer"); | ||||
| this->m_state = state; | this->m_state = state; | ||||
| this->m_datatype = memoryProxy->getDataType(); | this->m_datatype = memoryProxy->getDataType(); | ||||
| int elem_stride = this->m_num_channels; | |||||
| set_base_buffer( | |||||
| this, getWidth(), getHeight(), this->m_num_channels, elem_stride, sizeof(float), false); | |||||
| } | } | ||||
| MemoryBuffer::MemoryBuffer(DataType dataType, const rcti &rect) | MemoryBuffer::MemoryBuffer(DataType dataType, const rcti &rect) | ||||
| { | { | ||||
| m_rect = rect; | m_rect = rect; | ||||
| this->m_memoryProxy = nullptr; | this->m_memoryProxy = nullptr; | ||||
| this->m_num_channels = COM_data_type_num_channels(dataType); | this->m_num_channels = COM_data_type_num_channels(dataType); | ||||
| this->m_buffer = (float *)MEM_mallocN_aligned( | this->m_buffer = (float *)MEM_mallocN_aligned( | ||||
| sizeof(float) * buffer_len() * this->m_num_channels, 16, "COM_MemoryBuffer"); | sizeof(float) * buffer_len() * this->m_num_channels, 16, "COM_MemoryBuffer"); | ||||
| this->m_state = MemoryBufferState::Temporary; | this->m_state = MemoryBufferState::Temporary; | ||||
| this->m_datatype = dataType; | this->m_datatype = dataType; | ||||
| int elem_stride = this->m_num_channels; | |||||
| set_base_buffer( | |||||
| this, getWidth(), getHeight(), this->m_num_channels, elem_stride, sizeof(float), false); | |||||
| } | } | ||||
| MemoryBuffer::MemoryBuffer(const MemoryBuffer &src) | MemoryBuffer::MemoryBuffer(const MemoryBuffer &src) | ||||
| : MemoryBuffer(src.m_memoryProxy, src.m_rect, MemoryBufferState::Temporary) | : MemoryBuffer(src.m_memoryProxy, src.m_rect, MemoryBufferState::Temporary) | ||||
| { | { | ||||
| memcpy(m_buffer, src.m_buffer, buffer_len() * m_num_channels * sizeof(float)); | memcpy(m_buffer, src.m_buffer, buffer_len() * m_num_channels * sizeof(float)); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 124 Lines • Show Last 20 Lines | |||||