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