1 /*
2 * Copyright 2019 NXP
3 * All rights reserved.
4 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 */
7
8 #include "vglite_support.h"
9 #include "vg_lite_platform.h"
10 #include "vglite_window.h"
11
12 /*******************************************************************************
13 * Definitions
14 ******************************************************************************/
15
16 #if !DEMO_BUFFER_FIXED_ADDRESS
17 AT_NONCACHEABLE_SECTION_ALIGN(
18 static uint8_t s_frameBuffer[APP_BUFFER_COUNT][DEMO_BUFFER_HEIGHT][DEMO_BUFFER_WIDTH][DEMO_BUFFER_BYTE_PER_PIXEL],
19 FRAME_BUFFER_ALIGN);
20
21 #define DEMO_BUFFER0_ADDR (uint32_t) s_frameBuffer[0]
22
23 #if APP_BUFFER_COUNT > 1
24 #define DEMO_BUFFER1_ADDR (uint32_t) s_frameBuffer[1]
25 #endif
26
27 #if APP_BUFFER_COUNT > 2
28 #define DEMO_BUFFER2_ADDR (uint32_t) s_frameBuffer[2]
29 #endif
30
31 #endif
32
33 static const uint32_t s_frameBufferAddress[APP_BUFFER_COUNT] = {DEMO_BUFFER0_ADDR,
34 #if APP_BUFFER_COUNT > 1
35 DEMO_BUFFER1_ADDR,
36 #endif
37 #if APP_BUFFER_COUNT > 2
38 DEMO_BUFFER2_ADDR
39 #endif
40 };
41 /*******************************************************************************
42 * Prototypes
43 ******************************************************************************/
44
45 /*******************************************************************************
46 * Variables
47 ******************************************************************************/
48
49 /*******************************************************************************
50 * Code
51 ******************************************************************************/
video_format_to_vglite(video_pixel_format_t format)52 static vg_lite_buffer_format_t video_format_to_vglite(video_pixel_format_t format)
53 {
54 vg_lite_buffer_format_t fmt;
55 switch (format)
56 {
57 case kVIDEO_PixelFormatRGB565:
58 fmt = VG_LITE_BGR565;
59 break;
60
61 case kVIDEO_PixelFormatBGR565:
62 fmt = VG_LITE_RGB565;
63 break;
64
65 case kVIDEO_PixelFormatXRGB8888:
66 fmt = VG_LITE_BGRX8888;
67 break;
68
69 default:
70 fmt = VG_LITE_RGB565;
71 break;
72 }
73
74 return fmt;
75 }
76
VGLITE_CreateDisplay(vg_lite_display_t * display)77 vg_lite_error_t VGLITE_CreateDisplay(vg_lite_display_t *display)
78 {
79 if (!display)
80 return VG_LITE_INVALID_ARGUMENT;
81
82 FBDEV_Open(&display->g_fbdev, &g_dc, 0);
83
84 return VG_LITE_SUCCESS;
85 }
86
VGLITE_CreateWindow(vg_lite_display_t * display,vg_lite_window_t * window)87 vg_lite_error_t VGLITE_CreateWindow(vg_lite_display_t *display, vg_lite_window_t *window)
88 {
89 vg_lite_error_t ret = VG_LITE_SUCCESS;
90 status_t status;
91 void *buffer;
92 vg_lite_buffer_t *vg_buffer;
93 fbdev_t *g_fbdev = &(display->g_fbdev);
94 fbdev_fb_info_t *g_fbInfo = &(display->g_fbInfo);
95
96 window->bufferCount = APP_BUFFER_COUNT;
97 window->display = display;
98 window->width = DEMO_BUFFER_WIDTH;
99 window->height = DEMO_BUFFER_HEIGHT;
100 window->current = -1;
101 FBDEV_GetFrameBufferInfo(g_fbdev, g_fbInfo);
102
103 g_fbInfo->bufInfo.pixelFormat = DEMO_BUFFER_PIXEL_FORMAT;
104 g_fbInfo->bufInfo.startX = DEMO_BUFFER_START_X;
105 g_fbInfo->bufInfo.startY = DEMO_BUFFER_START_Y;
106 g_fbInfo->bufInfo.width = window->width;
107 g_fbInfo->bufInfo.height = window->height;
108 g_fbInfo->bufInfo.strideBytes = DEMO_BUFFER_STRIDE_BYTE;
109
110 g_fbInfo->bufferCount = window->bufferCount;
111 for (uint8_t i = 0; i < window->bufferCount; i++)
112 {
113 vg_buffer = &(window->buffers[i]);
114 g_fbInfo->buffers[i] = (void *)s_frameBufferAddress[i];
115 vg_buffer->memory = g_fbInfo->buffers[i];
116 vg_buffer->address = s_frameBufferAddress[i];
117 vg_buffer->width = g_fbInfo->bufInfo.width;
118 vg_buffer->height = g_fbInfo->bufInfo.height;
119 vg_buffer->stride = g_fbInfo->bufInfo.strideBytes;
120 vg_buffer->format = video_format_to_vglite(DEMO_BUFFER_PIXEL_FORMAT);
121 }
122
123 status = FBDEV_SetFrameBufferInfo(g_fbdev, g_fbInfo);
124 if (status != kStatus_Success)
125 {
126 while (1)
127 ;
128 }
129
130 buffer = FBDEV_GetFrameBuffer(g_fbdev, 0);
131
132 assert(buffer != NULL);
133
134 memset(buffer, 0, g_fbInfo->bufInfo.height * g_fbInfo->bufInfo.strideBytes);
135
136 FBDEV_SetFrameBuffer(g_fbdev, buffer, 0);
137
138 FBDEV_Enable(g_fbdev);
139
140 return ret;
141 }
142
VGLITE_DestoryWindow(void)143 vg_lite_error_t VGLITE_DestoryWindow(void)
144 {
145 return VG_LITE_SUCCESS;
146 }
147
VGLITE_DestroyDisplay(void)148 vg_lite_error_t VGLITE_DestroyDisplay(void)
149 {
150 return VG_LITE_SUCCESS;
151 }
152
VGLITE_GetRenderTarget(vg_lite_window_t * window)153 vg_lite_buffer_t *VGLITE_GetRenderTarget(vg_lite_window_t *window)
154 {
155 vg_lite_buffer_t *rt = NULL;
156 void *memory = FBDEV_GetFrameBuffer(&window->display->g_fbdev, 0);
157 for (uint8_t i = 0; i < window->bufferCount; i++)
158 {
159 rt = &(window->buffers[i]);
160 if (memory == rt->memory)
161 {
162 window->current = i;
163 return rt;
164 }
165 }
166 return NULL;
167 }
168
VGLITE_SwapBuffers(vg_lite_window_t * window)169 void VGLITE_SwapBuffers(vg_lite_window_t *window)
170 {
171 vg_lite_buffer_t *rt;
172 if (window->current >= 0 && window->current < window->bufferCount)
173 rt = &(window->buffers[window->current]);
174 else
175 return;
176
177 vg_lite_finish();
178
179 FBDEV_SetFrameBuffer(&window->display->g_fbdev, rt->memory, 0);
180 }
181