mirror of
https://github.com/libretro/RetroArch
synced 2025-02-04 21:40:02 +00:00
change video_rpi into a more generic video_vg
This commit is contained in:
parent
60e255dd12
commit
500139f1b5
10
Makefile
10
Makefile
@ -160,8 +160,7 @@ ifeq ($(HAVE_SDL), 1)
|
||||
LIBS += $(GBM_LIBS) $(DRM_LIBS) $(EGL_LIBS)
|
||||
else ifeq ($(HAVE_VIDEOCORE), 1)
|
||||
OBJ += gfx/context/vc_egl_ctx.o
|
||||
# videocore's libEGL needs libGLESv2 linked as well
|
||||
LIBS += -lGLESv2 -lEGL
|
||||
# videocore's libs set later
|
||||
else ifeq ($(HAVE_GLES), 1)
|
||||
OBJ += gfx/context/xegl_ctx.o
|
||||
DEFINES += $(EGL_CFLAGS)
|
||||
@ -179,10 +178,15 @@ ifeq ($(HAVE_SDL), 1)
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_VG), 1)
|
||||
OBJ += gfx/vg.o
|
||||
DEFINES += $(VG_CFLAGS)
|
||||
LIBS += $(VG_LIBS)
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(HAVE_VIDEOCORE), 1)
|
||||
OBJ += gfx/rpi.o
|
||||
LIBS += -lOpenVG -lGLESv2 -lEGL -lbcm_host -lvcos -lvchiq_arm
|
||||
endif
|
||||
|
||||
|
@ -37,7 +37,7 @@ enum
|
||||
VIDEO_WII,
|
||||
VIDEO_XENON360,
|
||||
VIDEO_XDK_D3D,
|
||||
VIDEO_RPI,
|
||||
VIDEO_VG,
|
||||
VIDEO_NULL,
|
||||
|
||||
AUDIO_RSOUND,
|
||||
@ -69,7 +69,7 @@ enum
|
||||
};
|
||||
|
||||
#if defined(HAVE_VIDEOCORE)
|
||||
#define VIDEO_DEFAULT_DRIVER VIDEO_RPI
|
||||
#define VIDEO_DEFAULT_DRIVER VIDEO_VG
|
||||
#elif defined(HAVE_OPENGL) || defined(__CELLOS_LV2__)
|
||||
#define VIDEO_DEFAULT_DRIVER VIDEO_GL
|
||||
#elif defined(GEKKO)
|
||||
@ -78,6 +78,8 @@ enum
|
||||
#define VIDEO_DEFAULT_DRIVER VIDEO_XENON360
|
||||
#elif (defined(_XBOX1) || defined(_XBOX360)) && (defined(HAVE_D3D8) || defined(HAVE_D3D9))
|
||||
#define VIDEO_DEFAULT_DRIVER VIDEO_XDK_D3D
|
||||
#elif defined(HAVE_VG)
|
||||
#define VIDEO_DEFAULT_DRIVER VIDEO_VG
|
||||
#elif defined(HAVE_XVIDEO)
|
||||
#define VIDEO_DEFAULT_DRIVER VIDEO_XVIDEO
|
||||
#elif defined(HAVE_SDL)
|
||||
|
4
driver.c
4
driver.c
@ -100,8 +100,8 @@ static const video_driver_t *video_drivers[] = {
|
||||
#ifdef GEKKO
|
||||
&video_gx,
|
||||
#endif
|
||||
#ifdef HAVE_VIDEOCORE
|
||||
&video_rpi,
|
||||
#ifdef HAVE_VG
|
||||
&video_vg,
|
||||
#endif
|
||||
&video_null,
|
||||
};
|
||||
|
2
driver.h
2
driver.h
@ -254,7 +254,7 @@ extern const video_driver_t video_xenon360;
|
||||
extern const video_driver_t video_xvideo;
|
||||
extern const video_driver_t video_xdk_d3d;
|
||||
extern const video_driver_t video_sdl;
|
||||
extern const video_driver_t video_rpi;
|
||||
extern const video_driver_t video_vg;
|
||||
extern const video_driver_t video_ext;
|
||||
extern const video_driver_t video_null;
|
||||
extern const input_driver_t input_sdl;
|
||||
|
232
gfx/vg.c
232
gfx/vg.c
@ -56,134 +56,134 @@ typedef struct
|
||||
VGPaint mPaintFg;
|
||||
VGPaint mPaintBg;
|
||||
#endif
|
||||
} rpi_t;
|
||||
} vg_t;
|
||||
|
||||
static void rpi_set_nonblock_state(void *data, bool state)
|
||||
static void vg_set_nonblock_state(void *data, bool state)
|
||||
{
|
||||
(void)data;
|
||||
gfx_ctx_set_swap_interval(state ? 0 : 1, true);
|
||||
}
|
||||
|
||||
static void *rpi_init(const video_info_t *video, const input_driver_t **input, void **input_data)
|
||||
static void *vg_init(const video_info_t *video, const input_driver_t **input, void **input_data)
|
||||
{
|
||||
rpi_t *rpi = (rpi_t*)calloc(1, sizeof(rpi_t));
|
||||
if (!rpi)
|
||||
vg_t *vg = (vg_t*)calloc(1, sizeof(vg_t));
|
||||
if (!vg)
|
||||
return NULL;
|
||||
|
||||
if (!eglBindAPI(EGL_OPENVG_API))
|
||||
if (!eglBindAPI(EGL_vg_API))
|
||||
return NULL;
|
||||
|
||||
if (!gfx_ctx_init())
|
||||
{
|
||||
free(rpi);
|
||||
free(vg);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
gfx_ctx_get_video_size(&rpi->mScreenWidth, &rpi->mScreenHeight);
|
||||
RARCH_LOG("Detecting screen resolution %ux%u.\n", rpi->mScreenWidth, rpi->mScreenHeight);
|
||||
gfx_ctx_get_video_size(&vg->mScreenWidth, &vg->mScreenHeight);
|
||||
RARCH_LOG("Detecting screen resolution %ux%u.\n", vg->mScreenWidth, vg->mScreenHeight);
|
||||
|
||||
gfx_ctx_set_swap_interval(video->vsync ? 1 : 0, false);
|
||||
|
||||
rpi->mTexType = video->rgb32 ? VG_sABGR_8888 : VG_sARGB_1555;
|
||||
rpi->mKeepAspect = video->force_aspect;
|
||||
vg->mTexType = video->rgb32 ? VG_sABGR_8888 : VG_sARGB_1555;
|
||||
vg->mKeepAspect = video->force_aspect;
|
||||
|
||||
// check for SD televisions: they should always be 4:3
|
||||
if (rpi->mScreenWidth == 720 && (rpi->mScreenHeight == 480 || rpi->mScreenHeight == 576))
|
||||
rpi->mScreenAspect = 4.0f / 3.0f;
|
||||
if ((vg->mScreenWidth == 640 || vg->mScreenWidth == 720) && (vg->mScreenHeight == 480 || vg->mScreenHeight == 576))
|
||||
vg->mScreenAspect = 4.0f / 3.0f;
|
||||
else
|
||||
rpi->mScreenAspect = (float)rpi->mScreenWidth / rpi->mScreenHeight;
|
||||
vg->mScreenAspect = (float)vg->mScreenWidth / vg->mScreenHeight;
|
||||
|
||||
VGfloat clearColor[4] = {0, 0, 0, 1};
|
||||
vgSetfv(VG_CLEAR_COLOR, 4, clearColor);
|
||||
|
||||
rpi->mTextureWidth = rpi->mTextureHeight = video->input_scale * RARCH_SCALE_BASE;
|
||||
vg->mTextureWidth = vg->mTextureHeight = video->input_scale * RARCH_SCALE_BASE;
|
||||
// We can't use the native format because there's no sXRGB_1555 type and
|
||||
// emulation cores can send 0 in the top bit. We lose some speed on
|
||||
// conversion but I doubt it has any real affect, since we are only drawing
|
||||
// one image at the end of the day. Still keep the alpha channel for ABGR.
|
||||
rpi->mImage = vgCreateImage(video->rgb32 ? VG_sABGR_8888 : VG_sXBGR_8888,
|
||||
rpi->mTextureWidth, rpi->mTextureHeight,
|
||||
vg->mImage = vgCreateImage(video->rgb32 ? VG_sABGR_8888 : VG_sXBGR_8888,
|
||||
vg->mTextureWidth, vg->mTextureHeight,
|
||||
video->smooth ? VG_IMAGE_QUALITY_BETTER : VG_IMAGE_QUALITY_NONANTIALIASED);
|
||||
rpi_set_nonblock_state(rpi, !video->vsync);
|
||||
vg_set_nonblock_state(vg, !video->vsync);
|
||||
|
||||
gfx_ctx_input_driver(input, input_data);
|
||||
|
||||
#ifdef HAVE_FREETYPE
|
||||
if (g_settings.video.font_enable)
|
||||
{
|
||||
rpi->mFont = vgCreateFont(0);
|
||||
rpi->mFontHeight = g_settings.video.font_size * (g_settings.video.font_scale ? (float) rpi->mScreenWidth / 1280.0f : 1.0f);
|
||||
vg->mFont = vgCreateFont(0);
|
||||
vg->mFontHeight = g_settings.video.font_size * (g_settings.video.font_scale ? (float) vg->mScreenWidth / 1280.0f : 1.0f);
|
||||
|
||||
const char *path = g_settings.video.font_path;
|
||||
if (!*path || !path_file_exists(path))
|
||||
path = font_renderer_get_default_font();
|
||||
|
||||
rpi->mFontRenderer = font_renderer_new(path, rpi->mFontHeight);
|
||||
vg->mFontRenderer = font_renderer_new(path, vg->mFontHeight);
|
||||
|
||||
if (rpi->mFont != VG_INVALID_HANDLE && rpi->mFontRenderer)
|
||||
if (vg->mFont != VG_INVALID_HANDLE && vg->mFontRenderer)
|
||||
{
|
||||
rpi->mFontsOn = true;
|
||||
vg->mFontsOn = true;
|
||||
|
||||
rpi->mPaintFg = vgCreatePaint();
|
||||
rpi->mPaintBg = vgCreatePaint();
|
||||
vg->mPaintFg = vgCreatePaint();
|
||||
vg->mPaintBg = vgCreatePaint();
|
||||
VGfloat paintFg[] = { g_settings.video.msg_color_r, g_settings.video.msg_color_g, g_settings.video.msg_color_b, 1.0f };
|
||||
VGfloat paintBg[] = { g_settings.video.msg_color_r / 2.0f, g_settings.video.msg_color_g / 2.0f, g_settings.video.msg_color_b / 2.0f, 0.5f };
|
||||
|
||||
vgSetParameteri(rpi->mPaintFg, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR);
|
||||
vgSetParameterfv(rpi->mPaintFg, VG_PAINT_COLOR, 4, paintFg);
|
||||
vgSetParameteri(vg->mPaintFg, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR);
|
||||
vgSetParameterfv(vg->mPaintFg, VG_PAINT_COLOR, 4, paintFg);
|
||||
|
||||
vgSetParameteri(rpi->mPaintBg, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR);
|
||||
vgSetParameterfv(rpi->mPaintBg, VG_PAINT_COLOR, 4, paintBg);
|
||||
vgSetParameteri(vg->mPaintBg, VG_PAINT_TYPE, VG_PAINT_TYPE_COLOR);
|
||||
vgSetParameterfv(vg->mPaintBg, VG_PAINT_COLOR, 4, paintBg);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return rpi;
|
||||
return vg;
|
||||
}
|
||||
|
||||
static void rpi_free(void *data)
|
||||
static void vg_free(void *data)
|
||||
{
|
||||
rpi_t *rpi = (rpi_t*)data;
|
||||
vg_t *vg = (vg_t*)data;
|
||||
|
||||
vgDestroyImage(rpi->mImage);
|
||||
vgDestroyImage(vg->mImage);
|
||||
|
||||
#ifdef HAVE_FREETYPE
|
||||
if (rpi->mFontsOn)
|
||||
if (vg->mFontsOn)
|
||||
{
|
||||
vgDestroyFont(rpi->mFont);
|
||||
font_renderer_free(rpi->mFontRenderer);
|
||||
vgDestroyPaint(rpi->mPaintFg);
|
||||
vgDestroyPaint(rpi->mPaintBg);
|
||||
vgDestroyFont(vg->mFont);
|
||||
font_renderer_free(vg->mFontRenderer);
|
||||
vgDestroyPaint(vg->mPaintFg);
|
||||
vgDestroyPaint(vg->mPaintBg);
|
||||
}
|
||||
#endif
|
||||
|
||||
gfx_ctx_destroy();
|
||||
|
||||
free(rpi);
|
||||
free(vg);
|
||||
}
|
||||
|
||||
#ifdef HAVE_FREETYPE
|
||||
|
||||
static void rpi_render_message(rpi_t *rpi, const char *msg)
|
||||
static void vg_render_message(vg_t *vg, const char *msg)
|
||||
{
|
||||
free(rpi->mLastMsg);
|
||||
rpi->mLastMsg = strdup(msg);
|
||||
free(vg->mLastMsg);
|
||||
vg->mLastMsg = strdup(msg);
|
||||
|
||||
if (rpi->mMsgLength)
|
||||
if (vg->mMsgLength)
|
||||
{
|
||||
while (--rpi->mMsgLength)
|
||||
vgClearGlyph(rpi->mFont, rpi->mMsgLength);
|
||||
while (--vg->mMsgLength)
|
||||
vgClearGlyph(vg->mFont, vg->mMsgLength);
|
||||
|
||||
vgClearGlyph(rpi->mFont, 0);
|
||||
vgClearGlyph(vg->mFont, 0);
|
||||
}
|
||||
|
||||
struct font_output_list out;
|
||||
font_renderer_msg(rpi->mFontRenderer, msg, &out);
|
||||
font_renderer_msg(vg->mFontRenderer, msg, &out);
|
||||
struct font_output *head = out.head;
|
||||
|
||||
while (head)
|
||||
{
|
||||
if (rpi->mMsgLength >= 1024)
|
||||
if (vg->mMsgLength >= 1024)
|
||||
break;
|
||||
|
||||
VGfloat origin[2], escapement[2];
|
||||
@ -200,40 +200,40 @@ static void rpi_render_message(rpi_t *rpi, const char *msg)
|
||||
for (unsigned i = 0; i < head->height; i++)
|
||||
vgImageSubData(img, head->output + head->pitch * i, head->pitch, VG_A_8, 0, head->height - i - 1, head->width, 1);
|
||||
|
||||
vgSetGlyphToImage(rpi->mFont, rpi->mMsgLength, img, origin, escapement);
|
||||
vgSetGlyphToImage(vg->mFont, vg->mMsgLength, img, origin, escapement);
|
||||
vgDestroyImage(img);
|
||||
|
||||
rpi->mMsgLength++;
|
||||
vg->mMsgLength++;
|
||||
head = head->next;
|
||||
}
|
||||
|
||||
font_renderer_free_output(&out);
|
||||
|
||||
for (unsigned i = 0; i < rpi->mMsgLength; i++)
|
||||
rpi->mGlyphIndices[i] = i;
|
||||
for (unsigned i = 0; i < vg->mMsgLength; i++)
|
||||
vg->mGlyphIndices[i] = i;
|
||||
}
|
||||
|
||||
static void rpi_draw_message(rpi_t *rpi, const char *msg)
|
||||
static void vg_draw_message(vg_t *vg, const char *msg)
|
||||
{
|
||||
if (!rpi->mLastMsg || strcmp(rpi->mLastMsg, msg))
|
||||
rpi_render_message(rpi, msg);
|
||||
if (!vg->mLastMsg || strcmp(vg->mLastMsg, msg))
|
||||
vg_render_message(vg, msg);
|
||||
|
||||
vgSeti(VG_SCISSORING, VG_FALSE);
|
||||
vgSeti(VG_IMAGE_MODE, VG_DRAW_IMAGE_STENCIL);
|
||||
|
||||
VGfloat origins[] = {
|
||||
rpi->mScreenWidth * g_settings.video.msg_pos_x - 2.0f,
|
||||
rpi->mScreenHeight * g_settings.video.msg_pos_y - 2.0f,
|
||||
vg->mScreenWidth * g_settings.video.msg_pos_x - 2.0f,
|
||||
vg->mScreenHeight * g_settings.video.msg_pos_y - 2.0f,
|
||||
};
|
||||
|
||||
vgSetfv(VG_GLYPH_ORIGIN, 2, origins);
|
||||
vgSetPaint(rpi->mPaintBg, VG_FILL_PATH);
|
||||
vgDrawGlyphs(rpi->mFont, rpi->mMsgLength, rpi->mGlyphIndices, NULL, NULL, VG_FILL_PATH, VG_TRUE);
|
||||
vgSetPaint(vg->mPaintBg, VG_FILL_PATH);
|
||||
vgDrawGlyphs(vg->mFont, vg->mMsgLength, vg->mGlyphIndices, NULL, NULL, VG_FILL_PATH, VG_TRUE);
|
||||
origins[0] += 2.0f;
|
||||
origins[1] += 2.0f;
|
||||
vgSetfv(VG_GLYPH_ORIGIN, 2, origins);
|
||||
vgSetPaint(rpi->mPaintFg, VG_FILL_PATH);
|
||||
vgDrawGlyphs(rpi->mFont, rpi->mMsgLength, rpi->mGlyphIndices, NULL, NULL, VG_FILL_PATH, VG_TRUE);
|
||||
vgSetPaint(vg->mPaintFg, VG_FILL_PATH);
|
||||
vgDrawGlyphs(vg->mFont, vg->mMsgLength, vg->mGlyphIndices, NULL, NULL, VG_FILL_PATH, VG_TRUE);
|
||||
|
||||
vgSeti(VG_SCISSORING, VG_TRUE);
|
||||
vgSeti(VG_IMAGE_MODE, VG_DRAW_IMAGE_NORMAL);
|
||||
@ -241,83 +241,83 @@ static void rpi_draw_message(rpi_t *rpi, const char *msg)
|
||||
|
||||
#endif
|
||||
|
||||
static void rpi_calculate_quad(rpi_t *rpi)
|
||||
static void vg_calculate_quad(vg_t *vg)
|
||||
{
|
||||
// set viewport for aspect ratio, taken from the OpenGL driver
|
||||
if (rpi->mKeepAspect)
|
||||
if (vg->mKeepAspect)
|
||||
{
|
||||
float desired_aspect = g_settings.video.aspect_ratio;
|
||||
|
||||
// If the aspect ratios of screen and desired aspect ratio are sufficiently equal (floating point stuff),
|
||||
// assume they are actually equal.
|
||||
if (fabs(rpi->mScreenAspect - desired_aspect) < 0.0001)
|
||||
if (fabs(vg->mScreenAspect - desired_aspect) < 0.0001)
|
||||
{
|
||||
rpi->x1 = 0;
|
||||
rpi->y1 = 0;
|
||||
rpi->x2 = rpi->mScreenWidth;
|
||||
rpi->y2 = rpi->mScreenHeight;
|
||||
vg->x1 = 0;
|
||||
vg->y1 = 0;
|
||||
vg->x2 = vg->mScreenWidth;
|
||||
vg->y2 = vg->mScreenHeight;
|
||||
}
|
||||
else if (rpi->mScreenAspect > desired_aspect)
|
||||
else if (vg->mScreenAspect > desired_aspect)
|
||||
{
|
||||
float delta = (desired_aspect / rpi->mScreenAspect - 1.0) / 2.0 + 0.5;
|
||||
rpi->x1 = rpi->mScreenWidth * (0.5 - delta);
|
||||
rpi->y1 = 0;
|
||||
rpi->x2 = 2.0 * rpi->mScreenWidth * delta + rpi->x1;
|
||||
rpi->y2 = rpi->mScreenHeight + rpi->y1;
|
||||
float delta = (desired_aspect / vg->mScreenAspect - 1.0) / 2.0 + 0.5;
|
||||
vg->x1 = vg->mScreenWidth * (0.5 - delta);
|
||||
vg->y1 = 0;
|
||||
vg->x2 = 2.0 * vg->mScreenWidth * delta + vg->x1;
|
||||
vg->y2 = vg->mScreenHeight + vg->y1;
|
||||
}
|
||||
else
|
||||
{
|
||||
float delta = (rpi->mScreenAspect / desired_aspect - 1.0) / 2.0 + 0.5;
|
||||
rpi->x1 = 0;
|
||||
rpi->y1 = rpi->mScreenHeight * (0.5 - delta);
|
||||
rpi->x2 = rpi->mScreenWidth + rpi->x1;
|
||||
rpi->y2 = 2.0 * rpi->mScreenHeight * delta + rpi->y1;
|
||||
float delta = (vg->mScreenAspect / desired_aspect - 1.0) / 2.0 + 0.5;
|
||||
vg->x1 = 0;
|
||||
vg->y1 = vg->mScreenHeight * (0.5 - delta);
|
||||
vg->x2 = vg->mScreenWidth + vg->x1;
|
||||
vg->y2 = 2.0 * vg->mScreenHeight * delta + vg->y1;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
rpi->x1 = 0;
|
||||
rpi->y1 = 0;
|
||||
rpi->x2 = rpi->mScreenWidth;
|
||||
rpi->y2 = rpi->mScreenHeight;
|
||||
vg->x1 = 0;
|
||||
vg->y1 = 0;
|
||||
vg->x2 = vg->mScreenWidth;
|
||||
vg->y2 = vg->mScreenHeight;
|
||||
}
|
||||
|
||||
rpi->scissor[0] = rpi->x1;
|
||||
rpi->scissor[1] = rpi->y1;
|
||||
rpi->scissor[2] = rpi->x2 - rpi->x1;
|
||||
rpi->scissor[3] = rpi->y2 - rpi->y1;
|
||||
vg->scissor[0] = vg->x1;
|
||||
vg->scissor[1] = vg->y1;
|
||||
vg->scissor[2] = vg->x2 - vg->x1;
|
||||
vg->scissor[3] = vg->y2 - vg->y1;
|
||||
|
||||
vgSetiv(VG_SCISSOR_RECTS, 4, rpi->scissor);
|
||||
vgSetiv(VG_SCISSOR_RECTS, 4, vg->scissor);
|
||||
}
|
||||
|
||||
static bool rpi_frame(void *data, const void *frame, unsigned width, unsigned height, unsigned pitch, const char *msg)
|
||||
static bool vg_frame(void *data, const void *frame, unsigned width, unsigned height, unsigned pitch, const char *msg)
|
||||
{
|
||||
rpi_t *rpi = (rpi_t*)data;
|
||||
rpi->frame_count++;
|
||||
vg_t *vg = (vg_t*)data;
|
||||
vg->frame_count++;
|
||||
|
||||
if (width != rpi->mRenderWidth || height != rpi->mRenderHeight)
|
||||
if (width != vg->mRenderWidth || height != vg->mRenderHeight)
|
||||
{
|
||||
rpi->mRenderWidth = width;
|
||||
rpi->mRenderHeight = height;
|
||||
rpi_calculate_quad(rpi);
|
||||
vg->mRenderWidth = width;
|
||||
vg->mRenderHeight = height;
|
||||
vg_calculate_quad(vg);
|
||||
vguComputeWarpQuadToQuad(
|
||||
rpi->x1, rpi->y1, rpi->x2, rpi->y1, rpi->x2, rpi->y2, rpi->x1, rpi->y2,
|
||||
vg->x1, vg->y1, vg->x2, vg->y1, vg->x2, vg->y2, vg->x1, vg->y2,
|
||||
// needs to be flipped, Khronos loves their bottom-left origin
|
||||
0, height, width, height, width, 0, 0, 0,
|
||||
rpi->mTransformMatrix);
|
||||
vg->mTransformMatrix);
|
||||
vgSeti(VG_MATRIX_MODE, VG_MATRIX_IMAGE_USER_TO_SURFACE);
|
||||
vgLoadMatrix(rpi->mTransformMatrix);
|
||||
vgLoadMatrix(vg->mTransformMatrix);
|
||||
}
|
||||
vgSeti(VG_SCISSORING, VG_FALSE);
|
||||
vgClear(0, 0, rpi->mScreenWidth, rpi->mScreenHeight);
|
||||
vgClear(0, 0, vg->mScreenWidth, vg->mScreenHeight);
|
||||
vgSeti(VG_SCISSORING, VG_TRUE);
|
||||
|
||||
vgImageSubData(rpi->mImage, frame, pitch, rpi->mTexType, 0, 0, width, height);
|
||||
vgDrawImage(rpi->mImage);
|
||||
vgImageSubData(vg->mImage, frame, pitch, vg->mTexType, 0, 0, width, height);
|
||||
vgDrawImage(vg->mImage);
|
||||
|
||||
#ifdef HAVE_FREETYPE
|
||||
if (msg && rpi->mFontsOn)
|
||||
rpi_draw_message(rpi, msg);
|
||||
if (msg && vg->mFontsOn)
|
||||
vg_draw_message(vg, msg);
|
||||
#else
|
||||
(void)msg;
|
||||
#endif
|
||||
@ -327,30 +327,30 @@ static bool rpi_frame(void *data, const void *frame, unsigned width, unsigned he
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool rpi_alive(void *data)
|
||||
static bool vg_alive(void *data)
|
||||
{
|
||||
rpi_t *rpi = (rpi_t*)data;
|
||||
vg_t *vg = (vg_t*)data;
|
||||
bool quit, resize;
|
||||
|
||||
gfx_ctx_check_window(&quit,
|
||||
&resize, &rpi->mScreenWidth, &rpi->mScreenHeight,
|
||||
rpi->frame_count);
|
||||
&resize, &vg->mScreenWidth, &vg->mScreenHeight,
|
||||
vg->frame_count);
|
||||
return !quit;
|
||||
}
|
||||
|
||||
static bool rpi_focus(void *data)
|
||||
static bool vg_focus(void *data)
|
||||
{
|
||||
(void)data;
|
||||
return gfx_ctx_window_has_focus();
|
||||
}
|
||||
|
||||
const video_driver_t video_rpi = {
|
||||
rpi_init,
|
||||
rpi_frame,
|
||||
rpi_set_nonblock_state,
|
||||
rpi_alive,
|
||||
rpi_focus,
|
||||
const video_driver_t video_vg = {
|
||||
vg_init,
|
||||
vg_frame,
|
||||
vg_set_nonblock_state,
|
||||
vg_alive,
|
||||
vg_focus,
|
||||
NULL,
|
||||
rpi_free,
|
||||
"rpi"
|
||||
vg_free,
|
||||
"vg"
|
||||
};
|
||||
|
@ -18,6 +18,7 @@ if [ "$HAVE_VIDEOCORE" = 'yes' ]; then
|
||||
[ -d /opt/vc/include ] && add_include_dirs /opt/vc/include
|
||||
[ -d /opt/vc/include/interface/vcos/pthreads ] && add_include_dirs /opt/vc/include/interface/vcos/pthreads
|
||||
HAVE_GLES='yes'
|
||||
HAVE_VG='yes'
|
||||
fi
|
||||
|
||||
if [ "$LIBRETRO" ]; then
|
||||
@ -137,9 +138,11 @@ if [ "$HAVE_KMS" = "yes" ]; then
|
||||
fi
|
||||
|
||||
[ "$HAVE_GLES" = "yes" ] && HAVE_EGL=yes && HAVE_XML=yes
|
||||
[ "$HAVE_VG" = "yes" ] && HAVE_EGL=yes
|
||||
if [ "$HAVE_VIDEOCORE" != "yes" ]; then
|
||||
check_pkgconf EGL egl
|
||||
check_pkgconf GLES glesv2
|
||||
check_pkgconf VG vg
|
||||
fi
|
||||
|
||||
check_pkgconf XML libxml-2.0
|
||||
@ -160,6 +163,6 @@ check_pkgconf PYTHON python3
|
||||
add_define_make OS "$OS"
|
||||
|
||||
# Creates config.mk and config.h.
|
||||
VARS="ALSA OSS OSS_BSD OSS_LIB AL RSOUND ROAR JACK COREAUDIO PULSE SDL OPENGL GLES EGL KMS GBM DRM DYLIB GETOPT_LONG THREADS CG XML SDL_IMAGE LIBPNG DYNAMIC FFMPEG AVCODEC AVFORMAT AVUTIL CONFIGFILE FREETYPE XVIDEO X11 XEXT NETPLAY NETWORK_CMD STDIN_CMD COMMAND SOCKET_LEGACY FBO PBO STRL PYTHON FFMPEG_ALLOC_CONTEXT3 FFMPEG_AVCODEC_OPEN2 FFMPEG_AVIO_OPEN FFMPEG_AVFORMAT_WRITE_HEADER FFMPEG_AVFORMAT_NEW_STREAM FFMPEG_AVCODEC_ENCODE_AUDIO2 FFMPEG_AVCODEC_ENCODE_VIDEO2 SINC FIXED_POINT BSV_MOVIE VIDEOCORE"
|
||||
VARS="ALSA OSS OSS_BSD OSS_LIB AL RSOUND ROAR JACK COREAUDIO PULSE SDL OPENGL GLES VG EGL KMS GBM DRM DYLIB GETOPT_LONG THREADS CG XML SDL_IMAGE LIBPNG DYNAMIC FFMPEG AVCODEC AVFORMAT AVUTIL CONFIGFILE FREETYPE XVIDEO X11 XEXT NETPLAY NETWORK_CMD STDIN_CMD COMMAND SOCKET_LEGACY FBO PBO STRL PYTHON FFMPEG_ALLOC_CONTEXT3 FFMPEG_AVCODEC_OPEN2 FFMPEG_AVIO_OPEN FFMPEG_AVFORMAT_WRITE_HEADER FFMPEG_AVFORMAT_NEW_STREAM FFMPEG_AVCODEC_ENCODE_AUDIO2 FFMPEG_AVCODEC_ENCODE_VIDEO2 SINC FIXED_POINT BSV_MOVIE VIDEOCORE"
|
||||
create_config_make config.mk $VARS
|
||||
create_config_header config.h $VARS
|
||||
|
@ -92,8 +92,8 @@ const char *config_get_default_video(void)
|
||||
return "sdl";
|
||||
case VIDEO_EXT:
|
||||
return "ext";
|
||||
case VIDEO_RPI:
|
||||
return "rpi";
|
||||
case VIDEO_VG:
|
||||
return "vg";
|
||||
case VIDEO_NULL:
|
||||
return "null";
|
||||
default:
|
||||
|
Loading…
x
Reference in New Issue
Block a user