mirror of
https://github.com/mpv-player/mpv.git
synced 2026-10-29 15:11:09 +08:00
These were separate for some reason which makes no sense and is really annoying if you want to use something that's in the vk version and not the gl one or vice versa. As a bonus, these now get to live right above the ra_swapchain definition which is more convenient.
98 lines
2.6 KiB
C
98 lines
2.6 KiB
C
/*
|
|
* This file is part of mpv.
|
|
*
|
|
* mpv is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* mpv is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with mpv. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include <vulkan/vulkan.h>
|
|
#include <vulkan/vulkan_android.h>
|
|
|
|
#include "video/out/android_common.h"
|
|
#include "common.h"
|
|
#include "context.h"
|
|
#include "utils.h"
|
|
|
|
struct priv {
|
|
struct mpvk_ctx vk;
|
|
};
|
|
|
|
static void android_uninit(struct ra_ctx *ctx)
|
|
{
|
|
struct priv *p = ctx->priv;
|
|
ra_vk_ctx_uninit(ctx);
|
|
mpvk_uninit(&p->vk);
|
|
|
|
vo_android_uninit(ctx->vo);
|
|
}
|
|
|
|
static bool android_init(struct ra_ctx *ctx)
|
|
{
|
|
struct priv *p = ctx->priv = talloc_zero(ctx, struct priv);
|
|
struct mpvk_ctx *vk = &p->vk;
|
|
int msgl = ctx->opts.probing ? MSGL_V : MSGL_ERR;
|
|
|
|
if (!vo_android_init(ctx->vo))
|
|
goto fail;
|
|
|
|
if (!mpvk_init(vk, ctx, VK_KHR_ANDROID_SURFACE_EXTENSION_NAME))
|
|
goto fail;
|
|
|
|
VkAndroidSurfaceCreateInfoKHR info = {
|
|
.sType = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR,
|
|
.window = vo_android_native_window(ctx->vo)
|
|
};
|
|
|
|
struct ra_ctx_params params = {0};
|
|
|
|
VkInstance inst = vk->vkinst->instance;
|
|
VkResult res = vkCreateAndroidSurfaceKHR(inst, &info, NULL, &vk->surface);
|
|
if (res != VK_SUCCESS) {
|
|
MP_MSG(ctx, msgl, "Failed creating Android surface\n");
|
|
goto fail;
|
|
}
|
|
|
|
if (!ra_vk_ctx_init(ctx, vk, params, VK_PRESENT_MODE_FIFO_KHR))
|
|
goto fail;
|
|
|
|
return true;
|
|
fail:
|
|
android_uninit(ctx);
|
|
return false;
|
|
}
|
|
|
|
static bool android_reconfig(struct ra_ctx *ctx)
|
|
{
|
|
int w, h;
|
|
if (!vo_android_surface_size(ctx->vo, &w, &h))
|
|
return false;
|
|
|
|
ra_vk_ctx_resize(ctx, w, h);
|
|
return true;
|
|
}
|
|
|
|
static int android_control(struct ra_ctx *ctx, int *events, int request, void *arg)
|
|
{
|
|
return VO_NOTIMPL;
|
|
}
|
|
|
|
const struct ra_ctx_fns ra_ctx_vulkan_android = {
|
|
.type = "vulkan",
|
|
.name = "androidvk",
|
|
.description = "Android/Vulkan",
|
|
.reconfig = android_reconfig,
|
|
.control = android_control,
|
|
.init = android_init,
|
|
.uninit = android_uninit,
|
|
};
|