diff --git a/src/Makefile.am b/src/Makefile.am index 9b668c8..d470747 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -35,6 +35,8 @@ libvrend_la_SOURCES = \ vrend_blitter.c \ vrend_blitter.h \ vrend_strbuf.h \ + vrend_tweaks.c \ + vrend_tweaks.h \ iov.c if HAVE_EPOXY_EGL diff --git a/src/virgl_protocol.h b/src/virgl_protocol.h index ac8bfba..107076a 100644 --- a/src/virgl_protocol.h +++ b/src/virgl_protocol.h @@ -592,4 +592,8 @@ enum virgl_context_cmd { #define VIRGL_COPY_TRANSFER3D_SRC_RES_OFFSET 13 #define VIRGL_COPY_TRANSFER3D_SYNCHRONIZED 14 -#endif +enum vrend_tweak_type { + virgl_tweak_undefined +}; + +#endif \ No newline at end of file diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c index 3f950f3..5d8f68f 100644 --- a/src/vrend_renderer.c +++ b/src/vrend_renderer.c @@ -593,6 +593,7 @@ struct vrend_sub_context { struct vrend_abo abo[PIPE_MAX_HW_ATOMIC_BUFFERS]; uint32_t abo_used_mask; + struct vrend_context_tweaks tweaks; }; struct vrend_context { @@ -667,6 +668,11 @@ static inline bool vrend_format_is_ds(enum virgl_formats format) return tex_conv_table[format].bindings & VIRGL_BIND_DEPTH_STENCIL; } +struct vrend_context_tweaks *vrend_get_context_tweaks(struct vrend_context *ctx) +{ + return &ctx->sub->tweaks; +} + bool vrend_format_is_emulated_alpha(enum virgl_formats format) { if (vrend_state.use_gles || !vrend_state.use_core_profile) diff --git a/src/vrend_renderer.h b/src/vrend_renderer.h index 5fe540f..7d92427 100644 --- a/src/vrend_renderer.h +++ b/src/vrend_renderer.h @@ -395,6 +395,8 @@ void vrend_renderer_get_rect(int resource_id, struct iovec *iov, unsigned int nu void vrend_renderer_attach_res_ctx(int ctx_id, int resource_id); void vrend_renderer_detach_res_ctx(int ctx_id, int resource_id); +struct vrend_context_tweaks *vrend_get_context_tweaks(struct vrend_context *ctx); + struct vrend_renderer_resource_info { uint32_t handle; uint32_t format; diff --git a/src/vrend_tweaks.c b/src/vrend_tweaks.c new file mode 100644 index 0000000..244010b --- /dev/null +++ b/src/vrend_tweaks.c @@ -0,0 +1,75 @@ +/************************************************************************** + * + * Copyright (C) 2018 Collabora Ltd + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER 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. + * + **************************************************************************/ + +#include +#include +#include "vrend_tweaks.h" +#include "vrend_debug.h" +#include "virgl_protocol.h" + +inline static void get_tf3_samples_passed_factor(struct vrend_context_tweaks *ctx, void *params) +{ + *(uint32_t *)params = ctx->tf3_samples_passed_factor; +} + +bool vrend_get_tweak_is_active_with_params(struct vrend_context_tweaks *ctx, enum vrend_tweak_type t, void *params) +{ + if (!(ctx->active_tweaks & (1u << t))) + return false; + + return true; +} + +bool vrend_get_tweak_is_active(struct vrend_context_tweaks *ctx, enum vrend_tweak_type t) +{ + return (ctx->active_tweaks & (1u << t)) ? true : false; +} + +const char *tweak_debug_table[] = { + [virgl_tweak_undefined] = "Undefined tweak" +}; + +static void set_tweak_and_params(struct vrend_context_tweaks *ctx, + enum vrend_tweak_type t, uint32_t value) +{ + ctx->active_tweaks |= 1u << t; +} + +static void set_tweak_and_params_from_string(struct vrend_context_tweaks *ctx, + enum vrend_tweak_type t, const char *value) +{ + ctx->active_tweaks |= 1u << t; + (void)value; +} + +/* we expect a string like tweak1:value,tweak2:value */ +void vrend_set_active_tweaks(struct vrend_context_tweaks *ctx, uint32_t tweak_id, uint32_t value) +{ + if (tweak_id < virgl_tweak_undefined) { + VREND_DEBUG(dbg_tweak, NULL, "Apply tweak '%s' = %u\n", tweak_debug_table[tweak_id], value); + set_tweak_and_params(ctx, tweak_id, value); + } else { + VREND_DEBUG(dbg_tweak, NULL, "Unknown tweak %d = %d sent\n", tweak_id, value); + } +} diff --git a/src/vrend_tweaks.h b/src/vrend_tweaks.h new file mode 100644 index 0000000..f3aee29 --- /dev/null +++ b/src/vrend_tweaks.h @@ -0,0 +1,49 @@ +/************************************************************************** + * + * Copyright (C) 2018 Collabora Ltd + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER 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. + * + **************************************************************************/ + +#ifndef VREND_TWEAKS_H +#define VREND_TWEAKS_H + +#include "virgl_protocol.h" + +#include +#include + +struct vrend_context_tweaks { + uint32_t active_tweaks; + int32_t tf3_samples_passed_factor; +}; + +bool vrend_get_tweak_is_active(struct vrend_context_tweaks *ctx, + enum vrend_tweak_type t); + +bool vrend_get_tweak_is_active_with_params(struct vrend_context_tweaks *ctx, + enum vrend_tweak_type t, void *params); + +void vrend_set_active_tweaks(struct vrend_context_tweaks *ctx, uint32_t tweak_id, uint32_t tweak_value); + + +void vrend_set_tweak_from_env(struct vrend_context_tweaks *ctx); + +#endif // VREND_TWEAKS_H