X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fdrivers%2Fvirgl%2Fvirgl_encode.c;h=d56484e0dd0ba27fa9ca8a53d2c82f0801afd0b3;hb=1b2444dffc93b21f93f06f58a0fc5875477b52cc;hp=1d193ae6c7f7aafe2bb7f0bf87c34a99df88f17b;hpb=a090df0d5dc804c1b6e16442a49b2ecb612a990d;p=mesa.git diff --git a/src/gallium/drivers/virgl/virgl_encode.c b/src/gallium/drivers/virgl/virgl_encode.c index 1d193ae6c7f..d56484e0dd0 100644 --- a/src/gallium/drivers/virgl/virgl_encode.c +++ b/src/gallium/drivers/virgl/virgl_encode.c @@ -241,6 +241,7 @@ int virgl_encode_shader_state(struct virgl_context *ctx, uint32_t handle, uint32_t type, const struct pipe_stream_output_info *so_info, + uint32_t cs_req_local_mem, const struct tgsi_token *tokens) { char *str, *sptr; @@ -260,7 +261,7 @@ int virgl_encode_shader_state(struct virgl_context *ctx, bret = tgsi_dump_str(tokens, TGSI_DUMP_FLOAT_AS_HEX, str, str_total_size); if (bret == false) { - fprintf(stderr, "Failed to translate shader in available space - trying again\n"); + debug_printf("Failed to translate shader in available space - trying again\n"); old_size = str_total_size; str_total_size = 65536 * ++retry_size; str = REALLOC(str, old_size, str_total_size); @@ -298,7 +299,10 @@ int virgl_encode_shader_state(struct virgl_context *ctx, virgl_emit_shader_header(ctx, handle, len, type, offlen, num_tokens); - virgl_emit_shader_streamout(ctx, first_pass ? so_info : NULL); + if (type == PIPE_SHADER_COMPUTE) + virgl_encoder_write_dword(ctx->cbuf, cs_req_local_mem); + else + virgl_emit_shader_streamout(ctx, first_pass ? so_info : NULL); virgl_encoder_write_block(ctx->cbuf, (uint8_t *)sptr, length); @@ -346,6 +350,12 @@ int virgl_encoder_set_framebuffer_state(struct virgl_context *ctx, virgl_encoder_write_dword(ctx->cbuf, surf ? surf->handle : 0); } + struct virgl_screen *rs = virgl_screen(ctx->base.screen); + if (rs->caps.caps.v2.capability_bits & VIRGL_CAP_FB_NO_ATTACH) { + virgl_encoder_write_cmd_dword(ctx, VIRGL_CMD0(VIRGL_CCMD_SET_FRAMEBUFFER_STATE_NO_ATTACH, 0, VIRGL_SET_FRAMEBUFFER_STATE_NO_ATTACH_SIZE)); + virgl_encoder_write_dword(ctx->cbuf, state->width | (state->height << 16)); + virgl_encoder_write_dword(ctx->cbuf, state->layers | (state->samples << 16)); + } return 0; } @@ -870,7 +880,7 @@ int virgl_encoder_set_so_targets(struct virgl_context *ctx, virgl_encoder_write_dword(ctx->cbuf, append_bitmask); for (i = 0; i < num_targets; i++) { struct virgl_so_target *tg = virgl_so_target(targets[i]); - virgl_encoder_write_dword(ctx->cbuf, tg->handle); + virgl_encoder_write_dword(ctx->cbuf, tg ? tg->handle : 0); } return 0; } @@ -980,3 +990,30 @@ int virgl_encode_memory_barrier(struct virgl_context *ctx, virgl_encoder_write_dword(ctx->cbuf, flags); return 0; } + +int virgl_encode_launch_grid(struct virgl_context *ctx, + const struct pipe_grid_info *grid_info) +{ + virgl_encoder_write_cmd_dword(ctx, VIRGL_CMD0(VIRGL_CCMD_LAUNCH_GRID, 0, VIRGL_LAUNCH_GRID_SIZE)); + virgl_encoder_write_dword(ctx->cbuf, grid_info->block[0]); + virgl_encoder_write_dword(ctx->cbuf, grid_info->block[1]); + virgl_encoder_write_dword(ctx->cbuf, grid_info->block[2]); + virgl_encoder_write_dword(ctx->cbuf, grid_info->grid[0]); + virgl_encoder_write_dword(ctx->cbuf, grid_info->grid[1]); + virgl_encoder_write_dword(ctx->cbuf, grid_info->grid[2]); + if (grid_info->indirect) { + struct virgl_resource *res = virgl_resource(grid_info->indirect); + virgl_encoder_write_res(ctx, res); + } else + virgl_encoder_write_dword(ctx->cbuf, 0); + virgl_encoder_write_dword(ctx->cbuf, grid_info->indirect_offset); + return 0; +} + +int virgl_encode_texture_barrier(struct virgl_context *ctx, + unsigned flags) +{ + virgl_encoder_write_cmd_dword(ctx, VIRGL_CMD0(VIRGL_CCMD_TEXTURE_BARRIER, 0, 1)); + virgl_encoder_write_dword(ctx->cbuf, flags); + return 0; +}