85 lines
2.3 KiB
C++
85 lines
2.3 KiB
C++
#if defined(SUPPORT_DISPMANX)
|
|
#include "dispmanx.h"
|
|
#include "types.h"
|
|
#include "wsi/context.h"
|
|
#include "cfg/option.h"
|
|
|
|
#include <bcm_host.h>
|
|
#include <EGL/egl.h>
|
|
|
|
void dispmanx_window_create()
|
|
{
|
|
DISPMANX_DISPLAY_HANDLE_T dispman_display;
|
|
DISPMANX_UPDATE_HANDLE_T dispman_update;
|
|
DISPMANX_ELEMENT_HANDLE_T dispman_element;
|
|
VC_RECT_T src_rect;
|
|
VC_RECT_T dst_rect;
|
|
VC_DISPMANX_ALPHA_T dispman_alpha;
|
|
uint32_t screen_width;
|
|
uint32_t screen_height;
|
|
uint32_t window_width;
|
|
uint32_t window_height;
|
|
|
|
dispman_alpha.flags = DISPMANX_FLAGS_ALPHA_FIXED_ALL_PIXELS;
|
|
dispman_alpha.opacity = 0xFF;
|
|
dispman_alpha.mask = 0;
|
|
|
|
graphics_get_display_size(0 /* LCD */, &screen_width, &screen_height);
|
|
|
|
window_width = cfgLoadInt("window", "width", 0);
|
|
window_height = cfgLoadInt("window", "height", 0);
|
|
|
|
if(window_width < 1)
|
|
window_width = screen_width;
|
|
if(window_height < 1)
|
|
window_height = screen_height;
|
|
|
|
src_rect.x = 0;
|
|
src_rect.y = 0;
|
|
src_rect.width = window_width << 16;
|
|
src_rect.height = window_height << 16;
|
|
|
|
if (config::DispmanxMaintainAspect)
|
|
{
|
|
float screen_aspect = (float)screen_width / screen_height;
|
|
float window_aspect = (float)window_width / window_height;
|
|
if(screen_aspect > window_aspect)
|
|
{
|
|
dst_rect.width = window_width * screen_height / window_height;
|
|
dst_rect.height = screen_height;
|
|
}
|
|
else
|
|
{
|
|
dst_rect.width = screen_width;
|
|
dst_rect.height = window_height * screen_width / window_width;
|
|
}
|
|
dst_rect.x = (screen_width - dst_rect.width) / 2;
|
|
dst_rect.y = (screen_height - dst_rect.height) / 2;
|
|
}
|
|
else
|
|
{
|
|
dst_rect.x = 0;
|
|
dst_rect.y = 0;
|
|
dst_rect.width = screen_width;
|
|
dst_rect.height = screen_height;
|
|
}
|
|
|
|
dispman_display = vc_dispmanx_display_open( 0 /* LCD */);
|
|
dispman_update = vc_dispmanx_update_start( 0 );
|
|
dispman_element = vc_dispmanx_element_add(dispman_update, dispman_display,
|
|
0 /*layer*/, &dst_rect, 0 /*src*/,
|
|
&src_rect, DISPMANX_PROTECTION_NONE,
|
|
&dispman_alpha /*alpha*/, 0 /*clamp*/, (DISPMANX_TRANSFORM_T)0 /*transform*/);
|
|
|
|
static EGL_DISPMANX_WINDOW_T native_window;
|
|
native_window.element = dispman_element;
|
|
native_window.width = window_width;
|
|
native_window.height = window_height;
|
|
vc_dispmanx_update_submit_sync( dispman_update );
|
|
|
|
theGLContext.SetNativeWindow((EGLNativeWindowType)&native_window);
|
|
theGLContext.SetNativeDisplay((EGLNativeDisplayType)dispman_display);
|
|
InitRenderApi();
|
|
}
|
|
#endif
|