61 lines
1.7 KiB
C++
61 lines
1.7 KiB
C++
#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;
|
|
} |