#include "SwapChain.h" #include "stm32h7xx_hal.h" extern DMA_HandleTypeDef hdma_memtomem_dma1_stream0; extern SRAM_HandleTypeDef hsram1; volatile bool xferComplete = false; extern "C" void frameXferCpltCallback(DMA_HandleTypeDef* hdma){ xferComplete = true; } SwapChain::SwapChain() : _backBufferTexture(&_backBuffer, getBackBufferDescription()){ } void SwapChain::present(){ beginLcdUpload(); waitLcdUpload(); } uint32_t frameStartTime = 0; void SwapChain::beginLcdUpload(){ uint32_t frameMaxTime = 1000/112; auto frameTime = HAL_GetTick() - frameStartTime; if(frameTime < frameMaxTime){ HAL_Delay(frameMaxTime - frameTime); } Lcd::setCursor(0,0); Lcd::beginWriteGram(); frameStartTime = HAL_GetTick(); //SCB_CleanInvalidateDCache_by_Addr((uint32_t*)DisplayFsmcInterface::dataLocation, sizeof(frameBuffer)); //SCB_CleanDCache_by_Addr((uint32_t*)&frameBuffer[0], sizeof(frameBuffer)); //HAL_SRAM_Write_DMA(&hsram1, (uint32_t*)DisplayFsmcInterface::dataLocation, (uint32_t*)&frameBuffer[0], sizeof(frameBuffer) / 4); HAL_DMA_Start_IT(&hdma_memtomem_dma1_stream0, (uint32_t)_backBuffer.GetPointer(), (uint32_t)Stm32PlusPlus::Display::DisplayFsmcInterface::addressMap.dataLocation(), 320*240 / 2); } void SwapChain::waitLcdUpload(){ while(!xferComplete){} xferComplete = false; } void SwapChain::init() { hdma_memtomem_dma1_stream0.XferCpltCallback = frameXferCpltCallback; Lcd::init(); Lcd::setOrientation(90); } TextureDescription SwapChain::getBackBufferDescription(){ TextureDescription desc; desc.Width = BackBufferMipChain::Width; desc.Height = BackBufferMipChain::Height; desc.BytesPerPixel = BackBufferMipChain::BytesPerPixel; desc.MipCount = BackBufferMipChain::MipsCount; return desc; }