MCPcopy Create free account
hub / github.com/SakuraEngine/SakuraEngine / clone_impl

Function clone_impl

modules/engine/runtime/src/ecs/chunk_view.cpp:155–238  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

153}
154
155static void clone_impl(sugoi_chunk_view_t dstV, const sugoi_chunk_t* srcC, uint32_t srcStart, type_index_t type, EIndex srcOffset, EIndex dstOffset, uint32_t size, uint32_t align, uint32_t elemSize, resource_fields_t resourceFields, void (*copy)(sugoi_chunk_t* chunk, EIndex index, char* dst, sugoi_chunk_t* schunk, EIndex sindex, const char* src))
156{
157 SKR_ASSERT(!type.is_chunk());
158 char* dst = dstV.chunk->data() + (size_t)dstOffset + (size_t)size * dstV.start;
159 char* src = srcC->data() + (size_t)srcOffset + (size_t)size * srcStart;
160 auto storage = dstV.chunk->type->storage;
161 auto patchResources = [&](char* data)
162 {
163 forloop(k, 0, resourceFields.count)
164 {
165 auto field = ((intptr_t*)resourceFields.offsets)[k];
166 auto* resource = (skr_resource_handle_t*)(data + field);
167 if(resource->is_resolved())
168 {
169 new (resource) skr_resource_handle_t(*resource, (uint64_t)storage, SKR_REQUESTER_ENTITY);
170 }
171 }
172 };
173 if (copy)
174 {
175 if (type.is_buffer())
176 {
177 forloop (j, 0, dstV.count)
178 {
179 auto arrayDst = (sugoi_array_comp_t*)((size_t)j * size + dst);
180 auto arraySrc = (sugoi_array_comp_t*)((size_t)j * size + src);
181 if (!is_array_small(arraySrc)) // memory is on heap
182 {
183 size_t cap = (char*)arraySrc->EndX - (char*)arraySrc->BeginX;
184 arrayDst->BeginX = sugoi_array_comp_t::allocate(cap);
185 arrayDst->EndX = arrayDst->CapacityX = (char*)arrayDst->BeginX + cap;
186 }
187 else // memory is in chunk
188 {
189 new_array(arrayDst, size, elemSize, align);
190 arrayDst->EndX = (char*)arrayDst->BeginX + arraySrc->size_in_bytes();
191 }
192 for (char *currDst = (char*)arrayDst->BeginX, *currSrc = (char*)arraySrc->BeginX;
193 currDst != arrayDst->EndX; currDst += elemSize, currSrc += elemSize)
194 copy(dstV.chunk, dstV.start + j, currDst, (sugoi_chunk_t*)srcC, srcStart + j, currSrc);
195 }
196 }
197 else
198 forloop (j, 0, dstV.count)
199 copy(dstV.chunk, dstV.start + j, (size_t)j * size + dst, (sugoi_chunk_t*)srcC, srcStart + j, (size_t)j * size + src);
200 }
201 else
202 {
203 if (type.is_buffer())
204 {
205 forloop (j, 0, dstV.count)
206 {
207 auto arrayDst = (sugoi_array_comp_t*)((size_t)j * size + dst);
208 auto arraySrc = (sugoi_array_comp_t*)((size_t)j * size + src);
209 if (!is_array_small(arraySrc)) // memory is on heap
210 {
211 size_t cap = (char*)arraySrc->EndX - (char*)arraySrc->BeginX;
212 arrayDst->BeginX = sugoi_array_comp_t::allocate(cap);

Callers

nothing calls this directly

Calls 10

is_array_smallFunction · 0.85
new_arrayFunction · 0.85
memcpyFunction · 0.85
is_chunkMethod · 0.80
is_resolvedMethod · 0.80
is_bufferMethod · 0.80
allocateFunction · 0.50
copyFunction · 0.50
dataMethod · 0.45
size_in_bytesMethod · 0.45

Tested by

no test coverage detected