rt-thread-official/bsp/imxrt/imxrt1170-nxp-evk/m7/board/vglite_window.c

181 lines
5.0 KiB
C

/*
* Copyright 2019 NXP
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "vglite_support.h"
#include "vg_lite_platform.h"
#include "vglite_window.h"
/*******************************************************************************
* Definitions
******************************************************************************/
#if !DEMO_BUFFER_FIXED_ADDRESS
AT_NONCACHEABLE_SECTION_ALIGN(
static uint8_t s_frameBuffer[APP_BUFFER_COUNT][DEMO_BUFFER_HEIGHT][DEMO_BUFFER_WIDTH][DEMO_BUFFER_BYTE_PER_PIXEL],
FRAME_BUFFER_ALIGN);
#define DEMO_BUFFER0_ADDR (uint32_t) s_frameBuffer[0]
#if APP_BUFFER_COUNT > 1
#define DEMO_BUFFER1_ADDR (uint32_t) s_frameBuffer[1]
#endif
#if APP_BUFFER_COUNT > 2
#define DEMO_BUFFER2_ADDR (uint32_t) s_frameBuffer[2]
#endif
#endif
static const uint32_t s_frameBufferAddress[APP_BUFFER_COUNT] = {DEMO_BUFFER0_ADDR,
#if APP_BUFFER_COUNT > 1
DEMO_BUFFER1_ADDR,
#endif
#if APP_BUFFER_COUNT > 2
DEMO_BUFFER2_ADDR
#endif
};
/*******************************************************************************
* Prototypes
******************************************************************************/
/*******************************************************************************
* Variables
******************************************************************************/
/*******************************************************************************
* Code
******************************************************************************/
static vg_lite_buffer_format_t video_format_to_vglite(video_pixel_format_t format)
{
vg_lite_buffer_format_t fmt;
switch (format)
{
case kVIDEO_PixelFormatRGB565:
fmt = VG_LITE_BGR565;
break;
case kVIDEO_PixelFormatBGR565:
fmt = VG_LITE_RGB565;
break;
case kVIDEO_PixelFormatXRGB8888:
fmt = VG_LITE_BGRX8888;
break;
default:
fmt = VG_LITE_RGB565;
break;
}
return fmt;
}
vg_lite_error_t VGLITE_CreateDisplay(vg_lite_display_t *display)
{
if (!display)
return VG_LITE_INVALID_ARGUMENT;
FBDEV_Open(&display->g_fbdev, &g_dc, 0);
return VG_LITE_SUCCESS;
}
vg_lite_error_t VGLITE_CreateWindow(vg_lite_display_t *display, vg_lite_window_t *window)
{
vg_lite_error_t ret = VG_LITE_SUCCESS;
status_t status;
void *buffer;
vg_lite_buffer_t *vg_buffer;
fbdev_t *g_fbdev = &(display->g_fbdev);
fbdev_fb_info_t *g_fbInfo = &(display->g_fbInfo);
window->bufferCount = APP_BUFFER_COUNT;
window->display = display;
window->width = DEMO_BUFFER_WIDTH;
window->height = DEMO_BUFFER_HEIGHT;
window->current = -1;
FBDEV_GetFrameBufferInfo(g_fbdev, g_fbInfo);
g_fbInfo->bufInfo.pixelFormat = DEMO_BUFFER_PIXEL_FORMAT;
g_fbInfo->bufInfo.startX = DEMO_BUFFER_START_X;
g_fbInfo->bufInfo.startY = DEMO_BUFFER_START_Y;
g_fbInfo->bufInfo.width = window->width;
g_fbInfo->bufInfo.height = window->height;
g_fbInfo->bufInfo.strideBytes = DEMO_BUFFER_STRIDE_BYTE;
g_fbInfo->bufferCount = window->bufferCount;
for (uint8_t i = 0; i < window->bufferCount; i++)
{
vg_buffer = &(window->buffers[i]);
g_fbInfo->buffers[i] = (void *)s_frameBufferAddress[i];
vg_buffer->memory = g_fbInfo->buffers[i];
vg_buffer->address = s_frameBufferAddress[i];
vg_buffer->width = g_fbInfo->bufInfo.width;
vg_buffer->height = g_fbInfo->bufInfo.height;
vg_buffer->stride = g_fbInfo->bufInfo.strideBytes;
vg_buffer->format = video_format_to_vglite(DEMO_BUFFER_PIXEL_FORMAT);
}
status = FBDEV_SetFrameBufferInfo(g_fbdev, g_fbInfo);
if (status != kStatus_Success)
{
while (1)
;
}
buffer = FBDEV_GetFrameBuffer(g_fbdev, 0);
assert(buffer != NULL);
memset(buffer, 0, g_fbInfo->bufInfo.height * g_fbInfo->bufInfo.strideBytes);
FBDEV_SetFrameBuffer(g_fbdev, buffer, 0);
FBDEV_Enable(g_fbdev);
return ret;
}
vg_lite_error_t VGLITE_DestoryWindow(void)
{
return VG_LITE_SUCCESS;
}
vg_lite_error_t VGLITE_DestroyDisplay(void)
{
return VG_LITE_SUCCESS;
}
vg_lite_buffer_t *VGLITE_GetRenderTarget(vg_lite_window_t *window)
{
vg_lite_buffer_t *rt = NULL;
void *memory = FBDEV_GetFrameBuffer(&window->display->g_fbdev, 0);
for (uint8_t i = 0; i < window->bufferCount; i++)
{
rt = &(window->buffers[i]);
if (memory == rt->memory)
{
window->current = i;
return rt;
}
}
return NULL;
}
void VGLITE_SwapBuffers(vg_lite_window_t *window)
{
vg_lite_buffer_t *rt;
if (window->current >= 0 && window->current < window->bufferCount)
rt = &(window->buffers[window->current]);
else
return;
vg_lite_finish();
FBDEV_SetFrameBuffer(&window->display->g_fbdev, rt->memory, 0);
}