|
@@ -22,6 +22,9 @@
|
|
|
*/
|
|
*/
|
|
|
|
|
|
|
|
#include "luat_base.h"
|
|
#include "luat_base.h"
|
|
|
|
|
+#include "luat_malloc.h"
|
|
|
|
|
+#define LUAT_LOG_TAG "sdl2"
|
|
|
|
|
+#include "luat_log.h"
|
|
|
#ifdef LUAT_USE_LVGL_SDL2
|
|
#ifdef LUAT_USE_LVGL_SDL2
|
|
|
#include <stdio.h>
|
|
#include <stdio.h>
|
|
|
#include <assert.h>
|
|
#include <assert.h>
|
|
@@ -32,37 +35,34 @@
|
|
|
static lv_disp_buf_t disp_buf;
|
|
static lv_disp_buf_t disp_buf;
|
|
|
static lv_color_t *pixels;
|
|
static lv_color_t *pixels;
|
|
|
static uint32_t *fb;
|
|
static uint32_t *fb;
|
|
|
-#ifdef NXDK
|
|
|
|
|
-#include <hal/video.h>
|
|
|
|
|
-void *framebuffer;
|
|
|
|
|
-#else
|
|
|
|
|
-#include <SDL2/SDL.h>
|
|
|
|
|
-static lv_task_t *sdl_present_task;
|
|
|
|
|
-
|
|
|
|
|
-SDL_Window *window = NULL;
|
|
|
|
|
-SDL_Renderer *renderer = NULL;
|
|
|
|
|
-SDL_Texture *framebuffer = NULL;
|
|
|
|
|
-#endif
|
|
|
|
|
|
|
+#include "luat_sdl2.h"
|
|
|
|
|
+// #ifdef NXDK
|
|
|
|
|
+// #include <hal/video.h>
|
|
|
|
|
+// void *framebuffer;
|
|
|
|
|
+// #else
|
|
|
|
|
+// #include <SDL2/SDL.h>
|
|
|
|
|
+// static lv_task_t *sdl_present_task;
|
|
|
|
|
+
|
|
|
|
|
+// SDL_Window *window = NULL;
|
|
|
|
|
+// SDL_Renderer *renderer = NULL;
|
|
|
|
|
+// SDL_Texture *framebuffer = NULL;
|
|
|
|
|
+// #endif
|
|
|
static void sdl_fb_flush(lv_disp_drv_t *disp_drv,
|
|
static void sdl_fb_flush(lv_disp_drv_t *disp_drv,
|
|
|
const lv_area_t *area,
|
|
const lv_area_t *area,
|
|
|
lv_color_t *color_p)
|
|
lv_color_t *color_p)
|
|
|
{
|
|
{
|
|
|
//printf("disp flush %d %d %d %d\n", area->x1, area->y1, area->x2, area->y2);
|
|
//printf("disp flush %d %d %d %d\n", area->x1, area->y1, area->x2, area->y2);
|
|
|
- if(area->x2 < 0 || area->y2 < 0 ||
|
|
|
|
|
- area->x1 > disp_drv->hor_res - 1 || area->y1 > disp_drv->ver_res - 1) {
|
|
|
|
|
|
|
+ if(area->x2 < 0 || area->y2 < 0 || area->x1 > disp_drv->hor_res - 1 || area->y1 > disp_drv->ver_res - 1) {
|
|
|
lv_disp_flush_ready(disp_drv);
|
|
lv_disp_flush_ready(disp_drv);
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
|
- SDL_Rect r;
|
|
|
|
|
- r.x = area->x1;
|
|
|
|
|
- r.y = area->y1;
|
|
|
|
|
- r.w = area->x2 - area->x1 + 1;
|
|
|
|
|
- r.h = area->y2 - area->y1 + 1;
|
|
|
|
|
|
|
+ size_t rw = area->x2 - area->x1 + 1;
|
|
|
|
|
+ size_t rh = area->y2 - area->y1 + 1;
|
|
|
|
|
|
|
|
uint32_t *tmp = fb;
|
|
uint32_t *tmp = fb;
|
|
|
- for (size_t i = 0; i < r.h; i++)
|
|
|
|
|
|
|
+ for (size_t i = 0; i < rh; i++)
|
|
|
{
|
|
{
|
|
|
- for (size_t j = 0; j < r.w; j++)
|
|
|
|
|
|
|
+ for (size_t j = 0; j < rw; j++)
|
|
|
{
|
|
{
|
|
|
*tmp = lv_color_to32(*color_p);
|
|
*tmp = lv_color_to32(*color_p);
|
|
|
tmp ++;
|
|
tmp ++;
|
|
@@ -70,27 +70,33 @@ static void sdl_fb_flush(lv_disp_drv_t *disp_drv,
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- SDL_UpdateTexture(framebuffer, &r, fb, r.w * 4);
|
|
|
|
|
|
|
+ luat_sdl2_draw(area->x1, area->y1, area->x2, area->y2, fb);
|
|
|
|
|
+ //SDL_UpdateTexture(framebuffer, &r, fb, r.w * 4);
|
|
|
|
|
+ if (disp_drv->buffer->flushing_last) {
|
|
|
|
|
+ //SDL_RenderCopy(renderer, framebuffer, NULL, NULL);
|
|
|
|
|
+ //SDL_RenderPresent(renderer);
|
|
|
|
|
+ luat_sdl2_flush();
|
|
|
|
|
+ }
|
|
|
lv_disp_flush_ready(disp_drv);
|
|
lv_disp_flush_ready(disp_drv);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-#ifndef NXDK
|
|
|
|
|
-static void sdl_present(lv_task_t *task)
|
|
|
|
|
-{
|
|
|
|
|
- if (renderer && framebuffer)
|
|
|
|
|
- {
|
|
|
|
|
- SDL_RenderCopy(renderer, framebuffer, NULL, NULL);
|
|
|
|
|
- SDL_RenderPresent(renderer);
|
|
|
|
|
- }
|
|
|
|
|
-}
|
|
|
|
|
-#endif
|
|
|
|
|
|
|
+// #ifndef NXDK
|
|
|
|
|
+// static void sdl_present(lv_task_t *task)
|
|
|
|
|
+// {
|
|
|
|
|
+// if (renderer && framebuffer)
|
|
|
|
|
+// {
|
|
|
|
|
+// SDL_RenderCopy(renderer, framebuffer, NULL, NULL);
|
|
|
|
|
+// SDL_RenderPresent(renderer);
|
|
|
|
|
+// }
|
|
|
|
|
+// }
|
|
|
|
|
+// #endif
|
|
|
|
|
|
|
|
-__attribute__((weak)) void display_wait_cb(lv_disp_drv_t *disp_drv)
|
|
|
|
|
-{
|
|
|
|
|
- (void)disp_drv;
|
|
|
|
|
|
|
+// __attribute__((weak)) void display_wait_cb(lv_disp_drv_t *disp_drv)
|
|
|
|
|
+// {
|
|
|
|
|
+ // (void)disp_drv;
|
|
|
//OPTIONAL: Called periodically while lvgl waits for an operation to be completed
|
|
//OPTIONAL: Called periodically while lvgl waits for an operation to be completed
|
|
|
// User can execute very simple tasks here or yield the task
|
|
// User can execute very simple tasks here or yield the task
|
|
|
-}
|
|
|
|
|
|
|
+// }
|
|
|
|
|
|
|
|
lv_disp_t *lv_sdl_init_display(const char *win_name, int width, int height)
|
|
lv_disp_t *lv_sdl_init_display(const char *win_name, int width, int height)
|
|
|
{
|
|
{
|
|
@@ -100,49 +106,55 @@ lv_disp_t *lv_sdl_init_display(const char *win_name, int width, int height)
|
|
|
if (height > LV_VER_RES_MAX)
|
|
if (height > LV_VER_RES_MAX)
|
|
|
height = LV_VER_RES_MAX;
|
|
height = LV_VER_RES_MAX;
|
|
|
size_t buff_line = 16;
|
|
size_t buff_line = 16;
|
|
|
- pixels = malloc(sizeof(lv_color_t) * width * buff_line);
|
|
|
|
|
- fb = malloc(sizeof(uint32_t) * width * buff_line);
|
|
|
|
|
|
|
+ pixels = luat_heap_malloc(sizeof(lv_color_t) * width * buff_line);
|
|
|
|
|
+ fb = luat_heap_malloc(sizeof(uint32_t) * width * buff_line);
|
|
|
//printf("pixels %p\n", pixels);
|
|
//printf("pixels %p\n", pixels);
|
|
|
lv_disp_buf_init(&disp_buf, pixels, NULL, width * buff_line);
|
|
lv_disp_buf_init(&disp_buf, pixels, NULL, width * buff_line);
|
|
|
lv_disp_drv_t disp_drv;
|
|
lv_disp_drv_t disp_drv;
|
|
|
lv_disp_drv_init(&disp_drv);
|
|
lv_disp_drv_init(&disp_drv);
|
|
|
disp_drv.buffer = &disp_buf;
|
|
disp_drv.buffer = &disp_buf;
|
|
|
- disp_drv.wait_cb = display_wait_cb;
|
|
|
|
|
|
|
+ // disp_drv.wait_cb = display_wait_cb;
|
|
|
disp_drv.flush_cb = sdl_fb_flush;
|
|
disp_drv.flush_cb = sdl_fb_flush;
|
|
|
disp_drv.hor_res = width;
|
|
disp_drv.hor_res = width;
|
|
|
disp_drv.ver_res = height;
|
|
disp_drv.ver_res = height;
|
|
|
|
|
|
|
|
- if (SDL_InitSubSystem(SDL_INIT_VIDEO) != 0)
|
|
|
|
|
- printf("SDL_InitSubSystem failed: %s\n", SDL_GetError());
|
|
|
|
|
|
|
+ luat_sdl2_conf_t conf = {
|
|
|
|
|
+ .width = width,
|
|
|
|
|
+ .height = height
|
|
|
|
|
+ };
|
|
|
|
|
+ luat_sdl2_init(&conf);
|
|
|
|
|
|
|
|
- window = SDL_CreateWindow(win_name,
|
|
|
|
|
- SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
|
|
|
|
|
- width, height, 0);
|
|
|
|
|
|
|
+ // if (SDL_InitSubSystem(SDL_INIT_VIDEO) != 0)
|
|
|
|
|
+ // printf("SDL_InitSubSystem failed: %s\n", SDL_GetError());
|
|
|
|
|
|
|
|
- renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
|
|
|
|
|
- framebuffer = SDL_CreateTexture(renderer,
|
|
|
|
|
- SDL_PIXELFORMAT_ARGB8888,
|
|
|
|
|
- SDL_TEXTUREACCESS_STREAMING,
|
|
|
|
|
- width,
|
|
|
|
|
- height);
|
|
|
|
|
|
|
+ // window = SDL_CreateWindow(win_name,
|
|
|
|
|
+ // SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
|
|
|
|
|
+ // width, height, 0);
|
|
|
|
|
|
|
|
- sdl_present_task = lv_task_create(sdl_present, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_HIGHEST, NULL);
|
|
|
|
|
|
|
+ // renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
|
|
|
|
|
+ // framebuffer = SDL_CreateTexture(renderer,
|
|
|
|
|
+ // SDL_PIXELFORMAT_ARGB8888,
|
|
|
|
|
+ // SDL_TEXTUREACCESS_STREAMING,
|
|
|
|
|
+ // width,
|
|
|
|
|
+ // height);
|
|
|
|
|
+
|
|
|
|
|
+ //sdl_present_task = lv_task_create(sdl_present, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_HIGHEST, NULL);
|
|
|
|
|
|
|
|
return lv_disp_drv_register(&disp_drv);
|
|
return lv_disp_drv_register(&disp_drv);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-void lv_sdl_deinit_display(void)
|
|
|
|
|
-{
|
|
|
|
|
- #ifdef NXDK
|
|
|
|
|
- XVideoFlushFB();
|
|
|
|
|
- MmFreeContiguousMemory(framebuffer);
|
|
|
|
|
- #else
|
|
|
|
|
- lv_task_del(sdl_present_task);
|
|
|
|
|
- SDL_DestroyTexture(framebuffer);
|
|
|
|
|
- SDL_DestroyRenderer(renderer);
|
|
|
|
|
- SDL_DestroyWindow(window);
|
|
|
|
|
- SDL_QuitSubSystem(SDL_INIT_VIDEO);
|
|
|
|
|
- #endif
|
|
|
|
|
-}
|
|
|
|
|
|
|
+// void lv_sdl_deinit_display(void)
|
|
|
|
|
+// {
|
|
|
|
|
+// #ifdef NXDK
|
|
|
|
|
+// XVideoFlushFB();
|
|
|
|
|
+// MmFreeContiguousMemory(framebuffer);
|
|
|
|
|
+// #else
|
|
|
|
|
+// lv_task_del(sdl_present_task);
|
|
|
|
|
+// SDL_DestroyTexture(framebuffer);
|
|
|
|
|
+// SDL_DestroyRenderer(renderer);
|
|
|
|
|
+// SDL_DestroyWindow(window);
|
|
|
|
|
+// SDL_QuitSubSystem(SDL_INIT_VIDEO);
|
|
|
|
|
+// #endif
|
|
|
|
|
+// }
|
|
|
|
|
|
|
|
#endif
|
|
#endif
|