MCPcopy Create free account
hub / github.com/apitrace/apitrace / commitWrites

Method commitWrites

wrappers/glmemshadow.cpp:349–393  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

347}
348
349void GLMemoryShadow::commitWrites(Callback callback)
350{
351 assert(isDirty);
352
353 uint8_t *shadowSlice = shadowMemory + mappedStartPage * sPageSize;
354 const size_t glStartOffset = mappedStart % sPageSize;
355
356 /* Other thread may write to the buffers at this very moment
357 * so we need to protect pages before we read from them.
358 * The other thread will have to wait until we commit all writes we want.
359 */
360 for (size_t i = mappedStartPage; i < mappedEndPage; i++) {
361 if (isPageDirty(i)) {
362 memProtect(shadowMemory + i * sPageSize, sPageSize, MemProtection::READ_ONLY);
363 }
364 }
365
366 for (size_t i = mappedStartPage; i < mappedEndPage; i++) {
367 if (isPageDirty(i)) {
368 // We coalesce consecutive writes into one
369 size_t firstDirty = i;
370 while (++i < mappedEndPage && isPageDirty(i)) { }
371
372 const size_t pages = i - firstDirty;
373 if (firstDirty != mappedStartPage) {
374 const size_t shadowOffset = (firstDirty - mappedStartPage) * sPageSize;
375 const size_t glOffset = shadowOffset - glStartOffset;
376 const size_t size = std::min(glStartOffset + mappedSize - shadowOffset, sPageSize * pages);
377
378 memcpy(glMemory + glOffset, shadowSlice + shadowOffset, size);
379 callback(shadowSlice + shadowOffset, size);
380 } else {
381 const size_t size = std::min(sPageSize * pages - glStartOffset, mappedSize);
382
383 memcpy(glMemory, shadowSlice + glStartOffset, size);
384 callback(shadowSlice + glStartOffset, size);
385 }
386 }
387 }
388
389 std::fill(dirtyPages.begin(), dirtyPages.end(), 0);
390 isDirty = false;
391 pagesToDirtyOnConsecutiveWrites = 1;
392 lastDirtiedRelativePage = UINT32_MAX - 1;
393}
394
395void GLMemoryShadow::updateForReads()
396{

Callers 1

commitAllWritesMethod · 0.80

Calls 3

memProtectFunction · 0.85
beginMethod · 0.45
endMethod · 0.45

Tested by

no test coverage detected