Use RARCH_DISPLAY_CTL_HW_CONTEXT_GET directly instead of

going through video_driver_callback
This commit is contained in:
twinaphex 2016-03-04 20:49:55 +01:00
parent a9d29041a3
commit 64a77af881
13 changed files with 101 additions and 91 deletions

View file

@ -1096,10 +1096,10 @@ bool event_cmd_ctl(enum event_command cmd, void *data)
break;
case EVENT_CMD_REINIT:
{
const struct retro_hw_render_callback *hw_render =
(const struct retro_hw_render_callback*)video_driver_callback();
struct retro_hw_render_callback *hwr = NULL;
video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr);
if (hw_render->cache_context)
if (hwr->cache_context)
video_driver_ctl(
RARCH_DISPLAY_CTL_SET_VIDEO_CACHE_CONTEXT, NULL);
else
@ -1270,11 +1270,12 @@ bool event_cmd_ctl(enum event_command cmd, void *data)
break;
case EVENT_CMD_CORE_DEINIT:
{
struct retro_hw_render_callback *cb = video_driver_callback();
struct retro_hw_render_callback *hwr = NULL;
video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr);
event_deinit_core(true);
if (cb)
memset(cb, 0, sizeof(*cb));
if (hwr)
memset(hwr, 0, sizeof(*hwr));
break;
}
@ -1319,14 +1320,17 @@ bool event_cmd_ctl(enum event_command cmd, void *data)
{
/* RARCH_DRIVER_CTL_UNINIT clears the callback struct so we
* need to make sure to keep a copy */
struct retro_hw_render_callback hw_render;
struct retro_hw_render_callback *hwr = NULL;
struct retro_hw_render_callback hwr_copy;
int flags = DRIVERS_CMD_ALL;
memcpy(&hw_render, video_driver_callback(), sizeof(hw_render));
video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr);
memcpy(&hwr_copy, hwr, sizeof(hwr_copy));
driver_ctl(RARCH_DRIVER_CTL_UNINIT, &flags);
memcpy(video_driver_callback(), &hw_render, sizeof(hw_render));
memcpy(hwr, &hwr_copy, sizeof(*hwr));
driver_ctl(RARCH_DRIVER_CTL_INIT, &flags);
}

View file

@ -327,15 +327,15 @@ static void init_drivers(int flags)
if (flags & DRIVER_VIDEO)
{
const struct retro_hw_render_callback *hw_render =
(const struct retro_hw_render_callback*)video_driver_callback();
struct retro_hw_render_callback *hwr = NULL;
video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr);
video_driver_ctl(RARCH_DISPLAY_CTL_MONITOR_RESET, NULL);
video_driver_ctl(RARCH_DISPLAY_CTL_INIT, NULL);
if (!video_driver_ctl(RARCH_DISPLAY_CTL_IS_VIDEO_CACHE_CONTEXT_ACK, NULL)
&& hw_render->context_reset)
hw_render->context_reset();
&& hwr->context_reset)
hwr->context_reset();
video_driver_ctl(RARCH_DISPLAY_CTL_UNSET_VIDEO_CACHE_CONTEXT_ACK, NULL);
runloop_ctl(RUNLOOP_CTL_SET_FRAME_TIME_LAST, NULL);

View file

@ -867,10 +867,12 @@ bool rarch_environment_cb(unsigned cmd, void *data)
case RETRO_ENVIRONMENT_SET_HW_RENDER:
case RETRO_ENVIRONMENT_SET_HW_RENDER | RETRO_ENVIRONMENT_EXPERIMENTAL:
{
struct retro_hw_render_callback *hw_render = video_driver_callback();
struct retro_hw_render_callback *hwr = NULL;
struct retro_hw_render_callback *cb =
(struct retro_hw_render_callback*)data;
video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr);
RARCH_LOG("Environ SET_HW_RENDER.\n");
switch (cb->context_type)
@ -943,10 +945,10 @@ bool rarch_environment_cb(unsigned cmd, void *data)
/* Old ABI. Don't copy garbage. */
if (cmd & RETRO_ENVIRONMENT_EXPERIMENTAL)
memcpy(hw_render,
memcpy(hwr,
cb, offsetof(struct retro_hw_render_callback, stencil));
else
memcpy(hw_render, cb, sizeof(*cb));
memcpy(hwr, cb, sizeof(*cb));
break;
}

View file

@ -782,8 +782,8 @@ static bool gl_init_hw_render(gl_t *gl, unsigned width, unsigned height)
unsigned i;
bool depth = false, stencil = false;
GLint max_fbo_size = 0, max_renderbuffer_size = 0;
const struct retro_hw_render_callback *hw_render =
(const struct retro_hw_render_callback*)video_driver_callback();
struct retro_hw_render_callback *hwr = NULL;
video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr);
/* We can only share texture objects through contexts.
* FBOs are "abstract" objects and are not shared. */
@ -801,8 +801,8 @@ static bool gl_init_hw_render(gl_t *gl, unsigned width, unsigned height)
glBindTexture(GL_TEXTURE_2D, 0);
glGenFramebuffers(gl->textures, gl->hw_render_fbo);
depth = hw_render->depth;
stencil = hw_render->stencil;
depth = hwr->depth;
stencil = hwr->stencil;
#ifdef HAVE_OPENGLES2
if (stencil && !gl_query_extension(gl, "OES_packed_depth_stencil"))
@ -2217,8 +2217,8 @@ static bool resolve_extensions(gl_t *gl, const char *context_ident)
const char *vendor = (const char*)glGetString(GL_VENDOR);
const char *renderer = (const char*)glGetString(GL_RENDERER);
const char *version = (const char*)glGetString(GL_VERSION);
const struct retro_hw_render_callback *hw_render =
(const struct retro_hw_render_callback*)video_driver_callback();
struct retro_hw_render_callback *hwr = NULL;
video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr);
#if defined(HAVE_GL_SYNC) || defined(HAVE_FBO)
settings_t *settings = config_get_ptr();
#endif
@ -2227,10 +2227,10 @@ static bool resolve_extensions(gl_t *gl, const char *context_ident)
(void)vendor;
(void)renderer;
(void)version;
(void)hw_render;
(void)hwr;
#ifndef HAVE_OPENGLES
gl->core_context =
(hw_render->context_type == RETRO_HW_CONTEXT_OPENGL_CORE);
(hwr->context_type == RETRO_HW_CONTEXT_OPENGL_CORE);
if (gl->core_context)
{
@ -2477,22 +2477,22 @@ static void gl_init_pbo_readback(gl_t *gl)
static const gfx_ctx_driver_t *gl_get_context(gl_t *gl)
{
const struct retro_hw_render_callback *cb =
(const struct retro_hw_render_callback*)video_driver_callback();
unsigned major = cb->version_major;
unsigned minor = cb->version_minor;
struct retro_hw_render_callback *hwr = NULL;
video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr);
unsigned major = hwr->version_major;
unsigned minor = hwr->version_minor;
settings_t *settings = config_get_ptr();
#ifdef HAVE_OPENGLES
enum gfx_ctx_api api = GFX_CTX_OPENGL_ES_API;
const char *api_name = "OpenGL ES 2.0";
#ifdef HAVE_OPENGLES3
if (cb->context_type == RETRO_HW_CONTEXT_OPENGLES3)
if (hwr->context_type == RETRO_HW_CONTEXT_OPENGLES3)
{
major = 3;
minor = 0;
api_name = "OpenGL ES 3.0";
}
else if (cb->context_type == RETRO_HW_CONTEXT_OPENGLES_VERSION)
else if (hwr->context_type == RETRO_HW_CONTEXT_OPENGLES_VERSION)
api_name = "OpenGL ES 3.1+";
#endif
#else
@ -2503,7 +2503,7 @@ static const gfx_ctx_driver_t *gl_get_context(gl_t *gl)
(void)api_name;
gl->shared_context_use = settings->video.shared_context
&& cb->context_type != RETRO_HW_CONTEXT_NONE;
&& hwr->context_type != RETRO_HW_CONTEXT_NONE;
return gfx_ctx_init_first(gl, settings->video.context_driver,
api, major, minor, gl->shared_context_use);
@ -2655,15 +2655,18 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo
video_shader_ctx_filter_t shader_filter;
video_shader_ctx_info_t shader_info;
video_shader_ctx_ident_t ident_info;
unsigned win_width, win_height, temp_width = 0, temp_height = 0;
bool force_smooth = false;
const char *vendor = NULL;
const char *renderer = NULL;
const char *version = NULL;
struct retro_hw_render_callback *hw_render = NULL;
settings_t *settings = config_get_ptr();
gl_t *gl = (gl_t*)calloc(1, sizeof(gl_t));
const gfx_ctx_driver_t *ctx_driver = gl_get_context(gl);
unsigned win_width = 0;
unsigned win_height = 0;
unsigned temp_width = 0;
unsigned temp_height = 0;
bool force_smooth = false;
const char *vendor = NULL;
const char *renderer = NULL;
const char *version = NULL;
struct retro_hw_render_callback *hwr = NULL;
settings_t *settings = config_get_ptr();
gl_t *gl = (gl_t*)calloc(1, sizeof(gl_t));
const gfx_ctx_driver_t *ctx_driver = gl_get_context(gl);
if (!gl || !ctx_driver)
goto error;
@ -2758,8 +2761,9 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo
gl->full_y = temp_height;
}
hw_render = video_driver_callback();
gl->vertex_ptr = hw_render->bottom_left_origin
video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr);
gl->vertex_ptr = hwr->bottom_left_origin
? vertexes : vertexes_flipped;
/* Better pipelining with GPU due to synchronous glSubTexImage.
@ -2768,7 +2772,7 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo
*/
gl->textures = 4;
#ifdef HAVE_FBO
gl->hw_render_use = hw_render->context_type != RETRO_HW_CONTEXT_NONE;
gl->hw_render_use = hwr->context_type != RETRO_HW_CONTEXT_NONE;
if (gl->hw_render_use)
{
@ -2787,7 +2791,7 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo
#ifdef HAVE_GLSL
gl_glsl_set_get_proc_address(ctx_driver->get_proc_address);
gl_glsl_set_context_type(gl->core_context,
hw_render->version_major, hw_render->version_minor);
hwr->version_major, hwr->version_minor);
#endif
if (!video_shader_driver_ctl(SHADER_CTL_INIT_FIRST, NULL))

View file

@ -842,12 +842,12 @@ static void vulkan_unlock_queue(void *handle)
static void vulkan_init_hw_render(vk_t *vk)
{
const struct retro_hw_render_callback *hw_render =
video_driver_callback();
struct retro_hw_render_interface_vulkan *iface =
&vk->hw.iface;
struct retro_hw_render_callback *hwr = NULL;
video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr);
if (hw_render->context_type != RETRO_HW_CONTEXT_VULKAN)
if (hwr->context_type != RETRO_HW_CONTEXT_VULKAN)
return;
vk->hw.enable = true;

View file

@ -459,15 +459,17 @@ static EGLint *gfx_ctx_drm_egl_fill_attribs(
#ifdef EGL_KHR_create_context
case GFX_CTX_OPENGL_API:
{
bool debug = false;
#ifdef HAVE_OPENGL
unsigned version = drm->egl.major * 1000 + drm->egl.minor;
bool core = version >= 3001;
#ifdef GL_DEBUG
bool debug = true;
debug = true;
#else
const struct retro_hw_render_callback *hw_render =
(const struct retro_hw_render_callback*)video_driver_callback();
bool debug = hw_render->debug_context;
struct retro_hw_render_callback *hwr = NULL;
video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr);
debug = hwr->debug_context;
#endif
if (core)

View file

@ -631,15 +631,16 @@ static EGLint *egl_fill_attribs(gfx_ctx_wayland_data_t *wl, EGLint *attr)
#ifdef EGL_KHR_create_context
case GFX_CTX_OPENGL_API:
{
bool debug = false;
#ifdef HAVE_OPENGL
unsigned version = wl->egl.major * 1000 + wl->egl.minor;
bool core = version >= 3001;
#ifdef GL_DEBUG
bool debug = true;
debug = true;
#else
const struct retro_hw_render_callback *hw_render =
(const struct retro_hw_render_callback*)video_driver_callback();
bool debug = hw_render->debug_context;
struct retro_hw_render_callback *hwr = NULL;
video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr);
debug = hwr->debug_context;
#endif
if (core)

View file

@ -98,15 +98,16 @@ static void setup_pixel_format(HDC hdc)
void create_gl_context(HWND hwnd, bool *quit)
{
bool core_context;
const struct retro_hw_render_callback *hw_render =
(const struct retro_hw_render_callback*)video_driver_callback();
bool debug = hw_render->debug_context;
struct retro_hw_render_callback *hwr = NULL;
bool debug = false;
video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr);
debug = hwr->debug_context;
#ifdef _WIN32
dll_handle = dylib_load("OpenGL32.dll");
dll_handle = dylib_load("OpenGL32.dll");
#endif
g_hdc = GetDC(hwnd);
g_hdc = GetDC(hwnd);
setup_pixel_format(g_hdc);
#ifdef GL_DEBUG

View file

@ -332,8 +332,8 @@ static void *gfx_ctx_x_init(void *data)
gfx_ctx_x_data_t *x = (gfx_ctx_x_data_t*)
calloc(1, sizeof(gfx_ctx_x_data_t));
#ifndef GL_DEBUG
const struct retro_hw_render_callback *hw_render =
(const struct retro_hw_render_callback*)video_driver_callback();
struct retro_hw_render_callback *hwr = NULL;
video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr);
#endif
if (!x)
@ -362,7 +362,7 @@ static void *gfx_ctx_x_init(void *data)
#ifdef GL_DEBUG
x->g_debug = true;
#else
x->g_debug = hw_render->debug_context;
x->g_debug = hwr->debug_context;
#endif
/* Have to use ContextAttribs */

View file

@ -189,14 +189,16 @@ static EGLint *xegl_fill_attribs(xegl_ctx_data_t *xegl, EGLint *attr)
#ifdef EGL_KHR_create_context
case GFX_CTX_OPENGL_API:
{
const struct retro_hw_render_callback *hw_render =
(const struct retro_hw_render_callback*)video_driver_callback();
bool debug = false;
unsigned version = xegl->egl.major * 1000 + xegl->egl.minor;
bool core = version >= 3001;
struct retro_hw_render_callback *hwr = NULL;
video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr);
#ifdef GL_DEBUG
bool debug = true;
debug = true;
#else
bool debug = hw_render->debug_context;
debug = hwr->debug_context;
#endif
if (core)

View file

@ -54,17 +54,19 @@ static bool gl_raster_font_upload_atlas(gl_raster_t *font,
unsigned width, unsigned height)
{
unsigned i, j;
GLint gl_internal = GL_LUMINANCE_ALPHA;
GLenum gl_format = GL_LUMINANCE_ALPHA;
size_t ncomponents = 2;
uint8_t *tmp = NULL;
struct retro_hw_render_callback *cb = video_driver_callback();
bool ancient = false; /* add a check here if needed */
bool modern = font->gl->core_context ||
(cb->context_type == RETRO_HW_CONTEXT_OPENGL &&
cb->version_major >= 3);
(void)modern;
GLint gl_internal = GL_LUMINANCE_ALPHA;
GLenum gl_format = GL_LUMINANCE_ALPHA;
size_t ncomponents = 2;
uint8_t *tmp = NULL;
struct retro_hw_render_callback *hwr = NULL;
bool ancient = false; /* add a check here if needed */
bool modern = font->gl->core_context;
video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr);
modern = modern ||
(hwr->context_type == RETRO_HW_CONTEXT_OPENGL &&
hwr->version_major >= 3);
if (ancient)
{

View file

@ -532,7 +532,8 @@ static bool uninit_video_input(void)
static bool init_video_pixel_converter(unsigned size)
{
struct retro_hw_render_callback *hwr = video_driver_callback();
struct retro_hw_render_callback *hwr = NULL;
video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr);
/* If pixel format is not 0RGB1555, we don't need to do
* any internal pixel conversion. */
@ -1026,13 +1027,6 @@ void video_driver_set_aspect_ratio_value(float value)
video_driver_state.aspect_ratio = value;
}
struct retro_hw_render_callback *video_driver_callback(void)
{
struct retro_hw_render_callback *hwr = NULL;
video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr);
return hwr;
}
static bool video_driver_frame_filter(const void *data,
unsigned width, unsigned height,
size_t pitch,
@ -1483,10 +1477,10 @@ bool video_driver_ctl(enum rarch_display_ctl_state state, void *data)
if (video_driver_ctl(RARCH_DISPLAY_CTL_IS_HW_CONTEXT, NULL))
{
struct retro_hw_render_callback *hwr =
video_driver_callback();
struct retro_hw_render_callback *hwr = NULL;
current_video = NULL;
video_driver_ctl(RARCH_DISPLAY_CTL_HW_CONTEXT_GET, &hwr);
(void)hwr;
if (hwr && hw_render_context_is_vulkan(hwr->context_type))

View file

@ -429,8 +429,6 @@ float video_driver_get_aspect_ratio(void);
void video_driver_set_aspect_ratio_value(float value);
struct retro_hw_render_callback *video_driver_callback(void);
rarch_softfilter_t *video_driver_frame_filter_get_ptr(void);
enum retro_pixel_format video_driver_get_pixel_format(void);