vglite_window.c 5.0 KB

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