| 415 | } |
| 416 | |
| 417 | Result Copy(const HBuffer dst_buffer_handle, const HBuffer src_buffer_handle) |
| 418 | { |
| 419 | const Buffer* dst_buffer = g_BufferContext->Get(dst_buffer_handle); |
| 420 | const Buffer* src_buffer = g_BufferContext->Get(src_buffer_handle); |
| 421 | |
| 422 | // Verify stream declaration is 1:1 |
| 423 | if (src_buffer->m_NumStreams != dst_buffer->m_NumStreams) { |
| 424 | return RESULT_STREAM_COUNT_MISMATCH; |
| 425 | } |
| 426 | |
| 427 | for (uint8_t i = 0; i < dst_buffer->m_NumStreams; ++i) |
| 428 | { |
| 429 | const Buffer::Stream& dst_stream = dst_buffer->m_Streams[i]; |
| 430 | const Buffer::Stream& src_stream = src_buffer->m_Streams[i]; |
| 431 | if (src_stream.m_Name != dst_stream.m_Name || |
| 432 | src_stream.m_Offset != dst_stream.m_Offset || |
| 433 | src_stream.m_ValueType != dst_stream.m_ValueType || |
| 434 | src_stream.m_ValueCount != dst_stream.m_ValueCount) |
| 435 | { |
| 436 | dmLogError("Stream mismatch: src(name: %s, offset: %u, type: %s, count: %u) != dst(name: %s, offset: %u, type: %s, count: %u)", |
| 437 | dmHashReverseSafe64(src_stream.m_Name), src_stream.m_Offset, GetValueTypeString((dmBuffer::ValueType)src_stream.m_ValueType), src_stream.m_ValueCount, |
| 438 | dmHashReverseSafe64(dst_stream.m_Name), dst_stream.m_Offset, GetValueTypeString((dmBuffer::ValueType)dst_stream.m_ValueType), dst_stream.m_ValueCount); |
| 439 | return RESULT_STREAM_MISMATCH; |
| 440 | } |
| 441 | } |
| 442 | |
| 443 | // Verify destination buffer has enough of element space |
| 444 | if (src_buffer->m_Count > dst_buffer->m_Count) { |
| 445 | return RESULT_BUFFER_SIZE_ERROR; |
| 446 | } |
| 447 | |
| 448 | // Get buffer pointers for dst and src |
| 449 | void* dst_bytes = 0x0; |
| 450 | uint32_t dst_size = 0; |
| 451 | dmBuffer::Result r = dmBuffer::GetBytes(dst_buffer_handle, &dst_bytes, &dst_size); |
| 452 | if (r != RESULT_OK) { |
| 453 | return r; |
| 454 | } |
| 455 | void* src_bytes = 0x0; |
| 456 | uint32_t src_size = 0; |
| 457 | r = dmBuffer::GetBytes(src_buffer_handle, &src_bytes, &src_size); |
| 458 | if (r != RESULT_OK) { |
| 459 | return r; |
| 460 | } |
| 461 | |
| 462 | // Copy memory |
| 463 | memcpy(dst_bytes, src_bytes, src_size); |
| 464 | |
| 465 | return RESULT_OK; |
| 466 | } |
| 467 | |
| 468 | void Destroy(HBuffer hbuffer) |
| 469 | { |
no test coverage detected