private bool copyToStaging(VTexPage page, StagingBufferSet buffers, IndirectionTexture indirectionTexture, OriginalTextureInfo textureUnit) { bool usedPhysicalPage = false; try { if (page.mip >= textureUnit.MipOffset) { //Load or grab from cache using (var pageHandle = textureCache.getImage(page, indirectionTexture, textureUnit, textelsPerPage, padding, padding2)) { buffers.setPhysicalPage(pageHandle.PixelBox, virtualTextureManager.getPhysicalTexture(textureUnit.TextureUnit), padding); usedPhysicalPage = true; } } else { Logging.Log.Warning("Unable to load mip map level {0} for texture {1}", page.mip - textureUnit.MipOffset, textureUnit.TextureFileName); } } catch (Exception ex) { Logging.Log.Error("{0} loading image {1}. Message: {2}", ex.GetType().Name, textureUnit.TextureFileName, ex.Message); } return(usedPhysicalPage); }
public void returnStagingBuffer(StagingBufferSet stagingBuffers) { lock (stagingBufferSets) { stagingBuffers.returnedToPool(); stagingBufferSets.Add(stagingBuffers); if (stagingBufferSets.Count > 0) { stagingBufferWaitEvent.Set(); } } }
private bool loadPage(VTexPage page, StagingBufferSet stagingBuffers) { bool added = false; try { //First see if we still have that page in our virtual texture pool, possible optimization to sort these to the front of the list if (physicalPageQueue.Count > 0) //Do we have pages available { PTexPage pTexPage = physicalPageQueue[0]; //The physical page candidate, do not modify before usedPhysicalPages if statement below if (loadImages(page, pTexPage, stagingBuffers)) { //Alert old texture of removal if there was one, Do not modify pTexPage above this if block, we need the old data IndirectionTexture oldIndirectionTexture = null; if (pTexPage.VirtualTexturePage != null) { if (virtualTextureManager.getIndirectionTexture(pTexPage.VirtualTexturePage.indirectionTexId, out oldIndirectionTexture)) { oldIndirectionTexture.removePhysicalPage(pTexPage); } physicalPagePool.Remove(pTexPage.VirtualTexturePage); //Be sure to remove the page from the pool if it was used previously } physicalPageQueue.RemoveAt(0); pTexPage.VirtualTexturePage = page; usedPhysicalPages.Add(page, pTexPage); //Add to new indirection texture IndirectionTexture newIndirectionTex; if (virtualTextureManager.getIndirectionTexture(page.indirectionTexId, out newIndirectionTex)) { newIndirectionTex.addPhysicalPage(pTexPage); stagingBuffers.setIndirectionTextures(oldIndirectionTexture, newIndirectionTex); } added = true; } } } catch (Exception ex) { Logging.Log.Debug("{0} loading page {1}. Message: {2}", ex.GetType().Name, page.ToString(), ex.Message); } return(added); }
/// <summary> /// Load the given image. Note that pTexPage is constant for the duration of this function call /// </summary> /// <param name="page"></param> /// <param name="pTexPage"></param> /// <returns></returns> private bool loadImages(VTexPage page, PTexPage pTexPage, StagingBufferSet stagingBuffers) { int stagingImageIndex = 0; bool usedPhysicalPage = false; IndirectionTexture indirectionTexture; if (virtualTextureManager.getIndirectionTexture(page.indirectionTexId, out indirectionTexture)) { //Fire off image loading and blitting tasks foreach (var textureUnit in indirectionTexture.OriginalTextures) { copyTostagingImageTasks[stagingImageIndex] = fireCopyToStaging(page, stagingBuffers, indirectionTexture, textureUnit); ++stagingImageIndex; } //Wait for results for (int i = 0; i < stagingImageIndex; ++i) { copyTostagingImageTasks[i].Wait(); if (copyTostagingImageTasks[i].Result) { usedPhysicalPage = true; } } //Single threaded //foreach (var textureUnit in indirectionTexture.OriginalTextures) //{ // if (copyToStaging(page, stagingBuffers, indirectionTexture, textureUnit)) // { // usedPhysicalPage = true; // } //} //Update staging buffer info stagingBuffers.Dest = new IntRect(pTexPage.x, pTexPage.y, textelsPerPhysicalPage, textelsPerPhysicalPage); } return(usedPhysicalPage); }
internal void syncToGpu(StagingBufferSet stagingBufferSet) { waitingGpuSyncs.Enqueue(stagingBufferSet); }
private Task <bool> fireCopyToStaging(VTexPage page, StagingBufferSet buffers, IndirectionTexture indirectionTexture, OriginalTextureInfo textureUnit) { return(Task.Run(() => copyToStaging(page, buffers, indirectionTexture, textureUnit))); }