Merge "VkFunctorDrawable implementation"
This commit is contained in:
committed by
Android (Google) Code Review
commit
34495b9fc8
@@ -74,7 +74,10 @@ struct AwDrawFn_InitVkParams {
|
||||
VkQueue queue;
|
||||
uint32_t graphics_queue_index;
|
||||
uint32_t instance_version;
|
||||
const char* const* enabled_extension_names;
|
||||
const char* const* enabled_instance_extension_names;
|
||||
uint32_t enabled_instance_extension_names_length;
|
||||
const char* const* enabled_device_extension_names;
|
||||
uint32_t enabled_device_extension_names_length;
|
||||
// Only one of device_features and device_features_2 should be non-null.
|
||||
// If both are null then no features are enabled.
|
||||
VkPhysicalDeviceFeatures* device_features;
|
||||
@@ -128,15 +131,13 @@ struct AwDrawFn_DrawVkParams {
|
||||
|
||||
struct AwDrawFn_PostDrawVkParams {
|
||||
int version;
|
||||
|
||||
// Input: Fence for the composite command buffer to signal it has finished its
|
||||
// work on the GPU.
|
||||
int fd;
|
||||
};
|
||||
|
||||
// Called on render thread while UI thread is blocked. Called for both GL and
|
||||
// VK.
|
||||
typedef void AwDrawFn_OnSync(int functor, void* data, AwDrawFn_OnSyncParams* params);
|
||||
typedef void AwDrawFn_OnSync(int functor,
|
||||
void* data,
|
||||
AwDrawFn_OnSyncParams* params);
|
||||
|
||||
// Called on render thread when either the context is destroyed _or_ when the
|
||||
// functor's last reference goes away. Will always be called with an active
|
||||
@@ -150,17 +151,24 @@ typedef void AwDrawFn_OnContextDestroyed(int functor, void* data);
|
||||
typedef void AwDrawFn_OnDestroyed(int functor, void* data);
|
||||
|
||||
// Only called for GL.
|
||||
typedef void AwDrawFn_DrawGL(int functor, void* data, AwDrawFn_DrawGLParams* params);
|
||||
typedef void AwDrawFn_DrawGL(int functor,
|
||||
void* data,
|
||||
AwDrawFn_DrawGLParams* params);
|
||||
|
||||
// Initialize vulkan state. Needs to be called again after any
|
||||
// OnContextDestroyed. Only called for Vulkan.
|
||||
typedef void AwDrawFn_InitVk(int functor, void* data, AwDrawFn_InitVkParams* params);
|
||||
typedef void AwDrawFn_InitVk(int functor,
|
||||
void* data,
|
||||
AwDrawFn_InitVkParams* params);
|
||||
|
||||
// Only called for Vulkan.
|
||||
typedef void AwDrawFn_DrawVk(int functor, void* data, AwDrawFn_DrawVkParams* params);
|
||||
typedef void AwDrawFn_DrawVk(int functor,
|
||||
void* data,
|
||||
AwDrawFn_DrawVkParams* params);
|
||||
|
||||
// Only called for Vulkan.
|
||||
typedef void AwDrawFn_PostDrawVk(int functor, void* data,
|
||||
typedef void AwDrawFn_PostDrawVk(int functor,
|
||||
void* data,
|
||||
AwDrawFn_PostDrawVkParams* params);
|
||||
|
||||
struct AwDrawFnFunctorCallbacks {
|
||||
@@ -183,7 +191,8 @@ enum AwDrawFnRenderMode {
|
||||
typedef AwDrawFnRenderMode AwDrawFn_QueryRenderMode(void);
|
||||
|
||||
// Create a functor. |functor_callbacks| should be valid until OnDestroyed.
|
||||
typedef int AwDrawFn_CreateFunctor(void* data, AwDrawFnFunctorCallbacks* functor_callbacks);
|
||||
typedef int AwDrawFn_CreateFunctor(void* data,
|
||||
AwDrawFnFunctorCallbacks* functor_callbacks);
|
||||
|
||||
// May be called on any thread to signal that the functor should be destroyed.
|
||||
// The functor will receive an onDestroyed when the last usage of it is
|
||||
|
||||
@@ -74,6 +74,79 @@ void draw_gl(int functor, void* data,
|
||||
support->callbacks.draw_gl(functor, support->data, ¶ms);
|
||||
}
|
||||
|
||||
void initializeVk(int functor, void* data,
|
||||
const uirenderer::VkFunctorInitParams& init_vk_params) {
|
||||
SupportData* support = static_cast<SupportData*>(data);
|
||||
VkPhysicalDeviceFeatures2 device_features_2;
|
||||
if (init_vk_params.device_features_2)
|
||||
device_features_2 = *init_vk_params.device_features_2;
|
||||
|
||||
AwDrawFn_InitVkParams params{
|
||||
.version = kAwDrawFnVersion,
|
||||
.instance = init_vk_params.instance,
|
||||
.physical_device = init_vk_params.physical_device,
|
||||
.device = init_vk_params.device,
|
||||
.queue = init_vk_params.queue,
|
||||
.graphics_queue_index = init_vk_params.graphics_queue_index,
|
||||
.instance_version = init_vk_params.instance_version,
|
||||
.enabled_instance_extension_names =
|
||||
init_vk_params.enabled_instance_extension_names,
|
||||
.enabled_instance_extension_names_length =
|
||||
init_vk_params.enabled_instance_extension_names_length,
|
||||
.enabled_device_extension_names =
|
||||
init_vk_params.enabled_device_extension_names,
|
||||
.enabled_device_extension_names_length =
|
||||
init_vk_params.enabled_device_extension_names_length,
|
||||
.device_features = nullptr,
|
||||
.device_features_2 =
|
||||
init_vk_params.device_features_2 ? &device_features_2 : nullptr,
|
||||
};
|
||||
support->callbacks.init_vk(functor, support->data, ¶ms);
|
||||
}
|
||||
|
||||
void drawVk(int functor, void* data, const uirenderer::VkFunctorDrawParams& draw_vk_params) {
|
||||
SupportData* support = static_cast<SupportData*>(data);
|
||||
float gabcdef[7];
|
||||
draw_vk_params.color_space_ptr->transferFn(gabcdef);
|
||||
AwDrawFn_DrawVkParams params{
|
||||
.version = kAwDrawFnVersion,
|
||||
.width = draw_vk_params.width,
|
||||
.height = draw_vk_params.height,
|
||||
.is_layer = draw_vk_params.is_layer,
|
||||
.secondary_command_buffer = draw_vk_params.secondary_command_buffer,
|
||||
.color_attachment_index = draw_vk_params.color_attachment_index,
|
||||
.compatible_render_pass = draw_vk_params.compatible_render_pass,
|
||||
.format = draw_vk_params.format,
|
||||
.transfer_function_g = gabcdef[0],
|
||||
.transfer_function_a = gabcdef[1],
|
||||
.transfer_function_b = gabcdef[2],
|
||||
.transfer_function_c = gabcdef[3],
|
||||
.transfer_function_d = gabcdef[4],
|
||||
.transfer_function_e = gabcdef[5],
|
||||
.transfer_function_f = gabcdef[6],
|
||||
.clip_left = draw_vk_params.clip_left,
|
||||
.clip_top = draw_vk_params.clip_top,
|
||||
.clip_right = draw_vk_params.clip_right,
|
||||
.clip_bottom = draw_vk_params.clip_bottom,
|
||||
};
|
||||
COMPILE_ASSERT(sizeof(params.color_space_toXYZD50) == sizeof(skcms_Matrix3x3),
|
||||
gamut_transform_size_mismatch);
|
||||
draw_vk_params.color_space_ptr->toXYZD50(
|
||||
reinterpret_cast<skcms_Matrix3x3*>(¶ms.color_space_toXYZD50));
|
||||
COMPILE_ASSERT(NELEM(params.transform) == NELEM(draw_vk_params.transform),
|
||||
mismatched_transform_matrix_sizes);
|
||||
for (int i = 0; i < NELEM(params.transform); ++i) {
|
||||
params.transform[i] = draw_vk_params.transform[i];
|
||||
}
|
||||
support->callbacks.draw_vk(functor, support->data, ¶ms);
|
||||
}
|
||||
|
||||
void postDrawVk(int functor, void* data) {
|
||||
SupportData* support = static_cast<SupportData*>(data);
|
||||
AwDrawFn_PostDrawVkParams params{.version = kAwDrawFnVersion};
|
||||
support->callbacks.post_draw_vk(functor, support->data, ¶ms);
|
||||
}
|
||||
|
||||
int CreateFunctor(void* data, AwDrawFnFunctorCallbacks* functor_callbacks) {
|
||||
static bool callbacks_initialized = false;
|
||||
static uirenderer::WebViewFunctorCallbacks webview_functor_callbacks = {
|
||||
@@ -82,9 +155,19 @@ int CreateFunctor(void* data, AwDrawFnFunctorCallbacks* functor_callbacks) {
|
||||
.onDestroyed = &onDestroyed,
|
||||
};
|
||||
if (!callbacks_initialized) {
|
||||
// Under uirenderer::RenderMode::Vulkan, whether gles or vk union should
|
||||
// be populated should match whether the vk-gl interop is used.
|
||||
webview_functor_callbacks.gles.draw = &draw_gl;
|
||||
switch (uirenderer::WebViewFunctor_queryPlatformRenderMode()) {
|
||||
case uirenderer::RenderMode::OpenGL_ES:
|
||||
webview_functor_callbacks.gles.draw = &draw_gl;
|
||||
break;
|
||||
case uirenderer::RenderMode::Vulkan:
|
||||
webview_functor_callbacks.vk.initialize = &initializeVk;
|
||||
webview_functor_callbacks.vk.draw = &drawVk;
|
||||
webview_functor_callbacks.vk.postDraw = &postDrawVk;
|
||||
// TODO(boliu): Remove this once SkiaRecordingCanvas::drawWebViewFunctor
|
||||
// no longer uses GL interop.
|
||||
webview_functor_callbacks.gles.draw = &draw_gl;
|
||||
break;
|
||||
}
|
||||
callbacks_initialized = true;
|
||||
}
|
||||
SupportData* support = new SupportData{
|
||||
|
||||
Reference in New Issue
Block a user