Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- diff -r 0f7577d28c6c src/video/kmsdrm/SDL_kmsdrmopengles.c
- --- a/src/video/kmsdrm/SDL_kmsdrmopengles.c Wed Jan 01 08:13:40 2020 -0800
- +++ b/src/video/kmsdrm/SDL_kmsdrmopengles.c Tue Mar 03 20:21:22 2020 +0100
- @@ -33,6 +33,9 @@
- #define EGL_PLATFORM_GBM_MESA 0x31D7
- #endif
- +extern rga_info_t src_info;
- +extern rga_info_t dst_info;
- +
- /* EGL implementation of SDL OpenGL support */
- int
- @@ -97,6 +100,7 @@
- SDL_VideoData *vdata = ((SDL_VideoData *)_this->driverdata);
- KMSDRM_FBInfo *fb_info;
- int ret;
- + struct gbm_bo* rga_buffer = NULL;
- /* Do we still need to wait for a flip? */
- int timeout = 0;
- @@ -116,7 +120,7 @@
- wdata->next_bo = NULL;
- }
- - if (!(_this->egl_data->eglSwapBuffers(_this->egl_data->egl_display, wdata->egl_surface))) {
- + if (!(_this->egl_data->eglSwapBuffers(_this->egl_data->egl_display, wdata->egl_surface))) {
- SDL_LogError(SDL_LOG_CATEGORY_VIDEO, "eglSwapBuffers failed.");
- return 0;
- }
- @@ -136,10 +140,22 @@
- SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO, "Locked GBM surface %p", (void *)wdata->next_bo); */
- }
- - fb_info = KMSDRM_FBFromBO(_this, wdata->next_bo);
- + src_info.fd = KMSDRM_gbm_bo_get_fd(wdata->next_bo);
- + dst_info.fd = vdata->rga_buffer_prime_fds[vdata->rga_buffer_index];
- + if (c_RkRgaBlit(&src_info, &dst_info, NULL) < 0) {
- + SDL_LogError(SDL_LOG_CATEGORY_VIDEO,
- + "Failed to rga blit\n");
- + }
- + close(src_info.fd);
- +
- + rga_buffer = vdata->rga_buffers[vdata->rga_buffer_index];
- + fb_info = KMSDRM_FBFromBO(_this, rga_buffer);
- if (fb_info == NULL) {
- return 0;
- }
- +
- + vdata->rga_buffer_index = (vdata->rga_buffer_index + 1) % RGA_BUFFERS_MAX;
- +
- if (_this->egl_data->egl_swapinterval == 0) {
- /* Swap buffers instantly, possible tearing */
- /* SDL_LogDebug(SDL_LOG_CATEGORY_VIDEO, "drmModeSetCrtc(%d, %u, %u, 0, 0, &%u, 1, &%ux%u@%u)",
- --- a/src/video/kmsdrm/SDL_kmsdrmsym.h
- +++ b/src/video/kmsdrm/SDL_kmsdrmsym.h
- @@ -88,6 +88,7 @@
- SDL_KMSDRM_SYM(void,gbm_surface_destroy,(struct gbm_surface *surf))
- SDL_KMSDRM_SYM(struct gbm_bo *,gbm_surface_lock_front_buffer,(struct gbm_surface *surf))
- SDL_KMSDRM_SYM(void,gbm_surface_release_buffer,(struct gbm_surface *surf, struct gbm_bo *bo))
- +SDL_KMSDRM_SYM(int,gbm_bo_get_fd,(struct gbm_bo *bo))
- #undef SDL_KMSDRM_MODULE
- diff -r 0f7577d28c6c src/video/kmsdrm/SDL_kmsdrmvideo.c
- --- a/src/video/kmsdrm/SDL_kmsdrmvideo.c Wed Jan 01 08:13:40 2020 -0800
- +++ b/src/video/kmsdrm/SDL_kmsdrmvideo.c Tue Mar 03 20:21:22 2020 +0100
- @@ -41,11 +41,15 @@
- #include "SDL_kmsdrmopengles.h"
- #include "SDL_kmsdrmmouse.h"
- #include "SDL_kmsdrmdyn.h"
- +#include <sys/ioctl.h>
- #include <sys/stat.h>
- #include <dirent.h>
- #include <errno.h>
- #define KMSDRM_DRI_PATH "/dev/dri/"
- +
- +rga_info_t src_info = {0};
- +rga_info_t dst_info = {0};
- static int
- check_modestting(int devindex)
- @@ -252,6 +256,38 @@
- free(fb_info);
- }
- +static void
- +KMSDRM_InitRotateBuffer(_THIS, int frameWidth, int frameHeight)
- +{
- + // acquire new DRM PRIME buffer for rotate screen
- + int ret;
- + SDL_VideoData *vdata = ((SDL_VideoData *)_this->driverdata);
- +
- + for (int i = 0; i < RGA_BUFFERS_MAX; ++i)
- + {
- + vdata->rga_buffers[i] = KMSDRM_gbm_bo_create(vdata->gbm,
- + frameWidth, frameHeight,
- + GBM_FORMAT_XRGB8888, GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING);
- + assert(vdata->rga_buffers[i]);
- +
- + vdata->rga_buffer_prime_fds[i] = KMSDRM_gbm_bo_get_fd(vdata->rga_buffers[i]);
- + }
- + vdata->rga_buffer_index = 0;
- +
- + // setup rotation
- + c_RkRgaInit();
- + src_info.mmuFlag = 1;
- + src_info.rotation = HAL_TRANSFORM_ROT_270;
- +
- + // swap width and height here because our source buffer is 480x320
- + rga_set_rect(&src_info.rect, 0, 0, frameHeight, frameWidth, frameHeight, frameWidth, RK_FORMAT_BGRA_8888);
- +
- + dst_info.fd = -1; //dph.fd;
- + dst_info.mmuFlag = 1;
- +
- + rga_set_rect(&dst_info.rect, 0, 0, frameWidth, frameHeight, frameWidth, frameHeight, RK_FORMAT_BGRA_8888);
- +}
- +
- KMSDRM_FBInfo *
- KMSDRM_FBFromBO(_THIS, struct gbm_bo *bo)
- {
- @@ -437,8 +473,8 @@
- SDL_zero(current_mode);
- - current_mode.w = vdata->saved_crtc->mode.hdisplay;
- - current_mode.h = vdata->saved_crtc->mode.vdisplay;
- + current_mode.w = data->cur_mode.vdisplay;
- + current_mode.h = data->cur_mode.hdisplay;
- current_mode.refresh_rate = vdata->saved_crtc->mode.vrefresh;
- /* FIXME ?
- @@ -553,6 +589,7 @@
- {
- SDL_WindowData *wdata;
- SDL_VideoDisplay *display;
- + SDL_DisplayData *data;
- SDL_VideoData *vdata = ((SDL_VideoData *)_this->driverdata);
- Uint32 surface_fmt, surface_flags;
- @@ -615,6 +652,10 @@
- SDL_SetKeyboardFocus(window);
- /* Window has been successfully created */
- +
- + data = display->driverdata;
- + KMSDRM_InitRotateBuffer(_this, data->cur_mode.hdisplay, data->cur_mode.vdisplay);
- +
- return 0;
- error:
- @@ -661,6 +702,7 @@
- }
- SDL_free(data);
- window->driverdata = NULL;
- + c_RkRgaDeInit();
- }
- }
- --- a/src/video/kmsdrm/SDL_kmsdrmvideo.h
- +++ b/src/video/kmsdrm/SDL_kmsdrmvideo.h
- @@ -35,6 +35,10 @@
- #if SDL_VIDEO_OPENGL_EGL
- #include <EGL/egl.h>
- #endif
- +#include <rga/RgaApi.h>
- +#include <assert.h>
- +
- +#define RGA_BUFFERS_MAX (3)
- typedef struct SDL_VideoData
- {
- @@ -46,6 +50,10 @@
- drmModeCrtc *saved_crtc; /* Saved CRTC to restore on quit */
- uint32_t saved_conn_id; /* Saved DRM connector ID */
- uint32_t crtc_id; /* CRTC in use */
- + int rotPrime_fd; /* dest rotate prime file descriptor */
- + struct gbm_bo* rga_buffers[RGA_BUFFERS_MAX];
- + int rga_buffer_prime_fds[RGA_BUFFERS_MAX];
- + int rga_buffer_index;
- } SDL_VideoData;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement