From 375c838984411dc6858ce2670c16c365567d8182 Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Fri, 28 Feb 2025 22:09:46 +0100 Subject: [PATCH] kopper: Add support for OHOS Signed-off-by: Christian Gmeiner --- src/gallium/drivers/zink/zink_instance.py | 11 ++++---- src/gallium/drivers/zink/zink_kopper.c | 31 +++++++++++++++++++++++ src/gallium/drivers/zink/zink_kopper.h | 3 ++- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/gallium/drivers/zink/zink_instance.py b/src/gallium/drivers/zink/zink_instance.py index 234d0ec02cd..ca334cf11ee 100755 --- a/src/gallium/drivers/zink/zink_instance.py +++ b/src/gallium/drivers/zink/zink_instance.py @@ -18,7 +18,7 @@ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS # IN THE SOFTWARE. -# +# # Authors: # Hoe Hao Cheng # @@ -49,6 +49,7 @@ EXTENSIONS = [ Extension("VK_KHR_xcb_surface"), Extension("VK_KHR_win32_surface"), Extension("VK_EXT_swapchain_colorspace"), + Extension("VK_OHOS_surface"), ] if platform.system() == "Darwin": @@ -139,7 +140,7 @@ zink_create_instance(struct zink_screen *screen, struct zink_instance_info *inst /* reserve one slot for MoltenVK */ const char *layers[${len(layers) + 1}] = {0}; uint32_t num_layers = 0; - + const char *extensions[${len(extensions) + 1}] = {0}; uint32_t num_extensions = 0; @@ -361,7 +362,7 @@ zink_verify_instance_extensions(struct zink_screen *screen) def replace_code(code: str, replacement: dict): for (k, v) in replacement.items(): code = code.replace(k, v) - + return code @@ -395,7 +396,7 @@ if __name__ == "__main__": error_count += 1 print("The extension {} is not registered in vk.xml - a typo?".format(ext.name)) continue - + entry = registry.get_registry_entry(ext.name) if entry.ext_type != "instance": @@ -407,7 +408,7 @@ if __name__ == "__main__": ext.core_since = Version((*entry.promoted_in, 0)) if entry.platform_guard: - ext.platform_guard = entry.platform_guard + ext.platform_guard = entry.platform_guard if error_count > 0: print("zink_instance.py: Found {} error(s) in total. Quitting.".format(error_count)) diff --git a/src/gallium/drivers/zink/zink_kopper.c b/src/gallium/drivers/zink/zink_kopper.c index 2773efbe29f..5596f00bbfc 100644 --- a/src/gallium/drivers/zink/zink_kopper.c +++ b/src/gallium/drivers/zink/zink_kopper.c @@ -79,6 +79,11 @@ init_dt_type(struct kopper_displaytarget *cdt) case VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR: cdt->type = KOPPER_WIN32; break; +#endif +#ifdef VK_USE_PLATFORM_OHOS + case VK_STRUCTURE_TYPE_SURFACE_CREATE_INFO_OHOS: + cdt->type = KOPPER_OHOS; + break; #endif default: UNREACHABLE("unsupported!"); @@ -118,6 +123,13 @@ kopper_CreateSurface(struct zink_screen *screen, struct kopper_displaytarget *cd error = VKSCR(CreateWin32SurfaceKHR)(screen->instance, win32, NULL, &surface); break; } +#endif +#ifdef VK_USE_PLATFORM_OHOS + case VK_STRUCTURE_TYPE_SURFACE_CREATE_INFO_OHOS: { + VkSurfaceCreateInfoOHOS *sci = (VkSurfaceCreateInfoOHOS *)&cdt->info.bos; + error = VKSCR(CreateSurfaceOHOS)(screen->instance, sci, NULL, &surface); + break; + } #endif default: UNREACHABLE("unsupported!"); @@ -234,6 +246,13 @@ find_dt_entry(struct zink_screen *screen, const struct kopper_displaytarget *cdt he = _mesa_hash_table_search(&screen->dts, win32->hwnd); break; } +#endif +#ifdef VK_USE_PLATFORM_OHOS + case KOPPER_OHOS: { + VkSurfaceCreateInfoOHOS *sci = (VkSurfaceCreateInfoOHOS *)&cdt->info.bos; + he = _mesa_hash_table_search(&screen->dts, sci->window); + break; + } #endif default: UNREACHABLE("unsupported!"); @@ -340,6 +359,10 @@ kopper_CreateSwapchain(struct zink_screen *screen, struct kopper_displaytarget * cswap->scci.imageExtent.width = w; cswap->scci.imageExtent.height = h; break; + case KOPPER_OHOS: + cswap->scci.imageExtent.width = w; + cswap->scci.imageExtent.height = h; + break; default: UNREACHABLE("unknown display platform"); } @@ -444,6 +467,7 @@ zink_kopper_displaytarget_create(struct zink_screen *screen, unsigned tex_usage, break; case KOPPER_WAYLAND: case KOPPER_WIN32: + case KOPPER_OHOS: _mesa_hash_table_init(&screen->dts, screen, _mesa_hash_pointer, _mesa_key_pointer_equal); break; default: @@ -515,6 +539,13 @@ zink_kopper_displaytarget_create(struct zink_screen *screen, unsigned tex_usage, _mesa_hash_table_insert(&screen->dts, win32->hwnd, cdt); break; } +#endif +#ifdef VK_USE_PLATFORM_OHOS + case KOPPER_OHOS: { + VkSurfaceCreateInfoOHOS *sci = (VkSurfaceCreateInfoOHOS *)&cdt->info.bos; + _mesa_hash_table_insert(&screen->dts, sci->window, cdt); + break; + } #endif default: UNREACHABLE("unsupported!"); diff --git a/src/gallium/drivers/zink/zink_kopper.h b/src/gallium/drivers/zink/zink_kopper.h index d1971ecb8b5..26083238516 100644 --- a/src/gallium/drivers/zink/zink_kopper.h +++ b/src/gallium/drivers/zink/zink_kopper.h @@ -74,7 +74,8 @@ struct kopper_swapchain { enum kopper_type { KOPPER_X11, KOPPER_WAYLAND, - KOPPER_WIN32 + KOPPER_WIN32, + KOPPER_OHOS, }; struct kopper_displaytarget