diff --git a/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_bridge.c b/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_bridge.c index 9419ebeb85b..79e4eb19924 100644 --- a/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_bridge.c +++ b/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_bridge.c @@ -309,6 +309,37 @@ void pvr_srv_free_sync_primitive_block(int fd, void *handle) } } +VkResult +pvr_srv_set_sync_primitive(int fd, void *handle, uint32_t index, uint32_t value) +{ + struct pvr_srv_bridge_sync_prim_set_cmd cmd = { + .handle = handle, + .index = index, + .value = value, + }; + + struct pvr_srv_bridge_sync_prim_set_ret ret = { + .error = PVR_SRV_ERROR_BRIDGE_CALL_FAILED, + }; + + int result; + + result = pvr_srv_bridge_call(fd, + PVR_SRV_BRIDGE_SYNC, + PVR_SRV_BRIDGE_SYNC_SYNCPRIMSET, + &cmd, + sizeof(cmd), + &ret, + sizeof(ret)); + if (result || ret.error != PVR_SRV_OK) { + return vk_bridge_err(VK_ERROR_UNKNOWN, + "PVR_SRV_BRIDGE_SYNC_SYNCPRIMSET", + ret); + } + + return VK_SUCCESS; +} + VkResult pvr_srv_get_heap_count(int fd, uint32_t *const heap_count_out) { struct pvr_srv_heap_count_cmd cmd = { diff --git a/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_bridge.h b/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_bridge.h index 1254fb7811e..099683415d0 100644 --- a/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_bridge.h +++ b/src/imagination/vulkan/winsys/pvrsrvkm/pvr_srv_bridge.h @@ -46,6 +46,7 @@ #define PVR_SRV_BRIDGE_SYNC_ALLOCSYNCPRIMITIVEBLOCK 0UL #define PVR_SRV_BRIDGE_SYNC_FREESYNCPRIMITIVEBLOCK 1UL +#define PVR_SRV_BRIDGE_SYNC_SYNCPRIMSET 2UL #define PVR_SRV_BRIDGE_MM 6UL @@ -247,6 +248,20 @@ struct pvr_srv_bridge_free_sync_primitive_block_ret { enum pvr_srv_error error; } PACKED; +/****************************************************************************** + PVR_SRV_BRIDGE_SYNC_SYNCPRIMSET structs + ******************************************************************************/ + +struct pvr_srv_bridge_sync_prim_set_cmd { + void *handle; + uint32_t index; + uint32_t value; +} PACKED; + +struct pvr_srv_bridge_sync_prim_set_ret { + enum pvr_srv_error error; +} PACKED; + /****************************************************************************** PVR_SRV_BRIDGE_MM_DEVMEMINTCTXCREATE structs ******************************************************************************/ @@ -885,6 +900,10 @@ VkResult pvr_srv_alloc_sync_primitive_block(int fd, uint32_t *const size_out, uint32_t *const addr_out); void pvr_srv_free_sync_primitive_block(int fd, void *handle); +VkResult pvr_srv_set_sync_primitive(int fd, + void *handle, + uint32_t index, + uint32_t value); VkResult pvr_srv_get_heap_count(int fd, uint32_t *const heap_count_out); VkResult pvr_srv_get_heap_details(int fd,