diff --git a/src/gallium/frontends/lavapipe/lvp_cmd_buffer.c b/src/gallium/frontends/lavapipe/lvp_cmd_buffer.c index b024cd73c01..3871990bae1 100644 --- a/src/gallium/frontends/lavapipe/lvp_cmd_buffer.c +++ b/src/gallium/frontends/lavapipe/lvp_cmd_buffer.c @@ -793,6 +793,9 @@ void lvp_CmdDispatch( cmd->u.dispatch.x = x; cmd->u.dispatch.y = y; cmd->u.dispatch.z = z; + cmd->u.dispatch.base_x = 0; + cmd->u.dispatch.base_y = 0; + cmd->u.dispatch.base_z = 0; cmd_buf_queue(cmd_buffer, cmd); } @@ -1764,3 +1767,36 @@ void lvp_CmdDrawIndirectByteCountEXT( cmd_buf_queue(cmd_buffer, cmd); } + +void lvp_CmdSetDeviceMask( + VkCommandBuffer commandBuffer, + uint32_t deviceMask) +{ + /* No-op */ +} + +void lvp_CmdDispatchBase( + VkCommandBuffer commandBuffer, + uint32_t base_x, + uint32_t base_y, + uint32_t base_z, + uint32_t x, + uint32_t y, + uint32_t z) +{ + LVP_FROM_HANDLE(lvp_cmd_buffer, cmd_buffer, commandBuffer); + struct lvp_cmd_buffer_entry *cmd; + + cmd = cmd_buf_entry_alloc(cmd_buffer, LVP_CMD_DISPATCH); + if (!cmd) + return; + + cmd->u.dispatch.x = x; + cmd->u.dispatch.y = y; + cmd->u.dispatch.z = z; + cmd->u.dispatch.base_x = base_x; + cmd->u.dispatch.base_y = base_y; + cmd->u.dispatch.base_z = base_z; + + cmd_buf_queue(cmd_buffer, cmd); +} diff --git a/src/gallium/frontends/lavapipe/lvp_execute.c b/src/gallium/frontends/lavapipe/lvp_execute.c index 960e07170f9..cfc77ae38a9 100644 --- a/src/gallium/frontends/lavapipe/lvp_execute.c +++ b/src/gallium/frontends/lavapipe/lvp_execute.c @@ -1948,6 +1948,9 @@ static void handle_dispatch(struct lvp_cmd_buffer_entry *cmd, state->dispatch_info.grid[0] = cmd->u.dispatch.x; state->dispatch_info.grid[1] = cmd->u.dispatch.y; state->dispatch_info.grid[2] = cmd->u.dispatch.z; + state->dispatch_info.grid_base[0] = cmd->u.dispatch.base_x; + state->dispatch_info.grid_base[1] = cmd->u.dispatch.base_y; + state->dispatch_info.grid_base[2] = cmd->u.dispatch.base_z; state->dispatch_info.indirect = NULL; state->pctx->launch_grid(state->pctx, &state->dispatch_info); } diff --git a/src/gallium/frontends/lavapipe/lvp_extensions.py b/src/gallium/frontends/lavapipe/lvp_extensions.py index 2189fcd5453..408d2572211 100644 --- a/src/gallium/frontends/lavapipe/lvp_extensions.py +++ b/src/gallium/frontends/lavapipe/lvp_extensions.py @@ -63,8 +63,8 @@ EXTENSIONS = [ Extension('VK_KHR_dedicated_allocation', 1, True), Extension('VK_KHR_depth_stencil_resolve', 1, False), Extension('VK_KHR_descriptor_update_template', 1, True), - Extension('VK_KHR_device_group', 1, False), - Extension('VK_KHR_device_group_creation', 1, False), + Extension('VK_KHR_device_group', 1, True), + Extension('VK_KHR_device_group_creation', 1, True), Extension('VK_KHR_draw_indirect_count', 1, True), Extension('VK_KHR_driver_properties', 1, True), Extension('VK_KHR_external_fence', 1, False), diff --git a/src/gallium/frontends/lavapipe/lvp_pipeline.c b/src/gallium/frontends/lavapipe/lvp_pipeline.c index cac750934e7..28aa1ddbe57 100644 --- a/src/gallium/frontends/lavapipe/lvp_pipeline.c +++ b/src/gallium/frontends/lavapipe/lvp_pipeline.c @@ -510,6 +510,7 @@ lvp_shader_compile_to_ir(struct lvp_pipeline *pipeline, .post_depth_coverage = true, .transform_feedback = true, .geometry_streams = true, + .device_group = true, }, .ubo_addr_format = nir_address_format_32bit_index_offset, .ssbo_addr_format = nir_address_format_32bit_index_offset, diff --git a/src/gallium/frontends/lavapipe/lvp_private.h b/src/gallium/frontends/lavapipe/lvp_private.h index 6860373bc5f..472ff9c5fc6 100644 --- a/src/gallium/frontends/lavapipe/lvp_private.h +++ b/src/gallium/frontends/lavapipe/lvp_private.h @@ -756,6 +756,9 @@ struct lvp_cmd_dispatch { uint32_t x; uint32_t y; uint32_t z; + uint32_t base_x; + uint32_t base_y; + uint32_t base_z; }; struct lvp_cmd_dispatch_indirect {