182 lines
5.1 KiB
C
182 lines
5.1 KiB
C
|
/*
|
||
|
* Copyright 2019 NXP
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||
|
*/
|
||
|
#include <rtthread.h>
|
||
|
#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][LCD_HEIGHT][LCD_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;
|
||
|
|
||
|
BOARD_PrepareDisplayController();
|
||
|
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);
|
||
|
}
|