Merge "VkFunctorDrawable implementation"

This commit is contained in:
TreeHugger Robot
2019-01-16 01:21:08 +00:00
committed by Android (Google) Code Review
12 changed files with 298 additions and 141 deletions

View File

@@ -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

View File

@@ -74,6 +74,79 @@ void draw_gl(int functor, void* data,
support->callbacks.draw_gl(functor, support->data, &params);
}
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, &params);
}
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*>(&params.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, &params);
}
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, &params);
}
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{