diff options
author | Elie Tournier <tournier.elie@gmail.com> | 2020-03-20 13:47:47 +0000 |
---|---|---|
committer | Elie Tournier <tournier.elie@gmail.com> | 2020-05-07 08:20:30 +0100 |
commit | 66b5e91c10de963095185472e7266eae93d26018 (patch) | |
tree | ed85525956bd969758ded53914a0d2ad576ab735 | |
parent | 71e0626657e053acd389ac510be571f90fd41457 (diff) | |
download | virglrenderer-66b5e91c10de963095185472e7266eae93d26018.tar.gz |
vrend: implement ARB_clear_texture
Signed-off-by: Elie Tournier <elie.tournier@collabora.com>
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
-rw-r--r-- | src/virgl_protocol.h | 18 | ||||
-rw-r--r-- | src/vrend_debug.c | 3 | ||||
-rw-r--r-- | src/vrend_decode.c | 30 | ||||
-rw-r--r-- | src/vrend_renderer.c | 32 | ||||
-rw-r--r-- | src/vrend_renderer.h | 5 |
5 files changed, 86 insertions, 2 deletions
diff --git a/src/virgl_protocol.h b/src/virgl_protocol.h index 93dbf6c1..a55424c3 100644 --- a/src/virgl_protocol.h +++ b/src/virgl_protocol.h @@ -102,6 +102,7 @@ enum virgl_context_cmd { VIRGL_CCMD_END_TRANSFERS, VIRGL_CCMD_COPY_TRANSFER3D, VIRGL_CCMD_SET_TWEAKS, + VIRGL_CCMD_CLEAR_TEXTURE, VIRGL_MAX_COMMANDS }; @@ -605,4 +606,19 @@ enum vrend_tweak_type { virgl_tweak_undefined }; -#endif
\ No newline at end of file +/* Clear texture */ +#define VIRGL_CLEAR_TEXTURE_SIZE 12 +#define VIRGL_TEXTURE_HANDLE 1 +#define VIRGL_TEXTURE_LEVEL 2 +#define VIRGL_TEXTURE_SRC_X 3 +#define VIRGL_TEXTURE_SRC_Y 4 +#define VIRGL_TEXTURE_SRC_Z 5 +#define VIRGL_TEXTURE_SRC_W 6 +#define VIRGL_TEXTURE_SRC_H 7 +#define VIRGL_TEXTURE_SRC_D 8 +#define VIRGL_TEXTURE_ARRAY_A 9 +#define VIRGL_TEXTURE_ARRAY_B 10 +#define VIRGL_TEXTURE_ARRAY_C 11 +#define VIRGL_TEXTURE_ARRAY_D 12 + +#endif diff --git a/src/vrend_debug.c b/src/vrend_debug.c index df24d86c..6444c540 100644 --- a/src/vrend_debug.c +++ b/src/vrend_debug.c @@ -75,7 +75,8 @@ static const char *command_names[VIRGL_MAX_COMMANDS] = { "TRANSFER3D", "END_TRANSFERS", "COPY_TRANSFER3D", - "TWEAK" + "TWEAK", + "CLEAR_TEXTURE" }; static const char *object_type_names[VIRGL_MAX_OBJECTS] = { diff --git a/src/vrend_decode.c b/src/vrend_decode.c index 4688d539..406ffb98 100644 --- a/src/vrend_decode.c +++ b/src/vrend_decode.c @@ -211,6 +211,33 @@ static int vrend_decode_clear(struct vrend_decode_ctx *ctx, int length) return 0; } +static int vrend_decode_clear_texture(struct vrend_decode_ctx *ctx, int length) +{ + struct pipe_box box; + uint32_t handle; + uint32_t level; + uint32_t arr[4] = {0}; + + if (length != VIRGL_CLEAR_TEXTURE_SIZE) + return EINVAL; + + handle = get_buf_entry(ctx, VIRGL_TEXTURE_HANDLE); + level = get_buf_entry(ctx, VIRGL_TEXTURE_LEVEL); + box.x = get_buf_entry(ctx, VIRGL_TEXTURE_SRC_X); + box.y = get_buf_entry(ctx, VIRGL_TEXTURE_SRC_Y); + box.z = get_buf_entry(ctx, VIRGL_TEXTURE_SRC_Z); + box.width = get_buf_entry(ctx, VIRGL_TEXTURE_SRC_W); + box.height = get_buf_entry(ctx, VIRGL_TEXTURE_SRC_H); + box.depth = get_buf_entry(ctx, VIRGL_TEXTURE_SRC_D); + arr[0] = get_buf_entry(ctx, VIRGL_TEXTURE_ARRAY_A); + arr[1] = get_buf_entry(ctx, VIRGL_TEXTURE_ARRAY_B); + arr[2] = get_buf_entry(ctx, VIRGL_TEXTURE_ARRAY_C); + arr[3] = get_buf_entry(ctx, VIRGL_TEXTURE_ARRAY_D); + + vrend_clear_texture(ctx->grctx, handle, level, &box, (void *) &arr); + return 0; +} + static float uif(unsigned int ui) { union { float f; unsigned int ui; } myuif; @@ -1496,6 +1523,9 @@ static int vrend_decode_ctx_submit_cmd(struct virgl_context *ctx, case VIRGL_CCMD_CLEAR: ret = vrend_decode_clear(gdctx, len); break; + case VIRGL_CCMD_CLEAR_TEXTURE: + ret = vrend_decode_clear_texture(gdctx, len); + break; case VIRGL_CCMD_DRAW_VBO: ret = vrend_decode_draw_vbo(gdctx, len); break; diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c index cc74dae4..77c66bf2 100644 --- a/src/vrend_renderer.c +++ b/src/vrend_renderer.c @@ -3720,6 +3720,38 @@ void vrend_clear(struct vrend_context *ctx, glDisable(GL_SCISSOR_TEST); } +void vrend_clear_texture(struct vrend_context* ctx, + uint32_t handle, uint32_t level, + const struct pipe_box *box, + const void * data) +{ + GLenum format, type; + struct vrend_resource *res; + + if (handle) + res = vrend_renderer_ctx_res_lookup(ctx, handle); + else { + vrend_printf( "cannot find resource for handle %d\n", handle); + return; + } + + enum virgl_formats fmt = vrend_format_replace_emulated(res->base.bind, res->base.format); + format = tex_conv_table[fmt].glformat; + type = tex_conv_table[fmt].gltype; + + if (vrend_state.use_gles) { + glClearTexSubImageEXT(res->id, level, + box->x, box->y, box->z, + box->width, box->height, box->depth, + format, type, data); + } else { + glClearTexSubImage(res->id, level, + box->x, box->y, box->z, + box->width, box->height, box->depth, + format, type, data); + } +} + static void vrend_update_scissor_state(struct vrend_context *ctx) { struct pipe_scissor_state *ss; diff --git a/src/vrend_renderer.h b/src/vrend_renderer.h index 5d044b17..6973db93 100644 --- a/src/vrend_renderer.h +++ b/src/vrend_renderer.h @@ -154,6 +154,11 @@ void vrend_clear(struct vrend_context *ctx, const union pipe_color_union *color, double depth, unsigned stencil); +void vrend_clear_texture(struct vrend_context* ctx, + uint32_t handle, uint32_t level, + const struct pipe_box *box, + const void * data); + int vrend_draw_vbo(struct vrend_context *ctx, const struct pipe_draw_info *info, uint32_t cso, uint32_t indirect_handle, uint32_t indirect_draw_count_handle); |