xref: /aosp_15_r20/external/virglrenderer/src/vrend_tweaks.c (revision bbecb9d118dfdb95f99bd754f8fa9be01f189df3)
1*bbecb9d1SAndroid Build Coastguard Worker /**************************************************************************
2*bbecb9d1SAndroid Build Coastguard Worker  *
3*bbecb9d1SAndroid Build Coastguard Worker  * Copyright (C) 2018 Collabora Ltd
4*bbecb9d1SAndroid Build Coastguard Worker  *
5*bbecb9d1SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
6*bbecb9d1SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
7*bbecb9d1SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
8*bbecb9d1SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9*bbecb9d1SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
10*bbecb9d1SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
11*bbecb9d1SAndroid Build Coastguard Worker  *
12*bbecb9d1SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be included
13*bbecb9d1SAndroid Build Coastguard Worker  * in all copies or substantial portions of the Software.
14*bbecb9d1SAndroid Build Coastguard Worker  *
15*bbecb9d1SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
16*bbecb9d1SAndroid Build Coastguard Worker  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*bbecb9d1SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*bbecb9d1SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
19*bbecb9d1SAndroid Build Coastguard Worker  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20*bbecb9d1SAndroid Build Coastguard Worker  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21*bbecb9d1SAndroid Build Coastguard Worker  * OTHER DEALINGS IN THE SOFTWARE.
22*bbecb9d1SAndroid Build Coastguard Worker  *
23*bbecb9d1SAndroid Build Coastguard Worker  **************************************************************************/
24*bbecb9d1SAndroid Build Coastguard Worker 
25*bbecb9d1SAndroid Build Coastguard Worker #include <string.h>
26*bbecb9d1SAndroid Build Coastguard Worker #include <stdlib.h>
27*bbecb9d1SAndroid Build Coastguard Worker #include "vrend_tweaks.h"
28*bbecb9d1SAndroid Build Coastguard Worker #include "vrend_debug.h"
29*bbecb9d1SAndroid Build Coastguard Worker #include "virgl_protocol.h"
30*bbecb9d1SAndroid Build Coastguard Worker 
get_tf3_samples_passed_factor(struct vrend_context_tweaks * ctx,void * params)31*bbecb9d1SAndroid Build Coastguard Worker inline static void get_tf3_samples_passed_factor(struct vrend_context_tweaks *ctx, void *params)
32*bbecb9d1SAndroid Build Coastguard Worker {
33*bbecb9d1SAndroid Build Coastguard Worker    *(uint32_t *)params =  ctx->tf3_samples_passed_factor;
34*bbecb9d1SAndroid Build Coastguard Worker }
35*bbecb9d1SAndroid Build Coastguard Worker 
vrend_get_tweak_is_active_with_params(struct vrend_context_tweaks * ctx,enum vrend_tweak_type t,void * params)36*bbecb9d1SAndroid Build Coastguard Worker bool vrend_get_tweak_is_active_with_params(struct vrend_context_tweaks *ctx, enum vrend_tweak_type t, void *params)
37*bbecb9d1SAndroid Build Coastguard Worker {
38*bbecb9d1SAndroid Build Coastguard Worker    if (!(ctx->active_tweaks & (1u << t)))
39*bbecb9d1SAndroid Build Coastguard Worker       return false;
40*bbecb9d1SAndroid Build Coastguard Worker 
41*bbecb9d1SAndroid Build Coastguard Worker    switch (t) {
42*bbecb9d1SAndroid Build Coastguard Worker    case virgl_tweak_gles_tf3_samples_passes_multiplier:
43*bbecb9d1SAndroid Build Coastguard Worker       get_tf3_samples_passed_factor(ctx, params); break;
44*bbecb9d1SAndroid Build Coastguard Worker    default:
45*bbecb9d1SAndroid Build Coastguard Worker       ;
46*bbecb9d1SAndroid Build Coastguard Worker    }
47*bbecb9d1SAndroid Build Coastguard Worker 
48*bbecb9d1SAndroid Build Coastguard Worker    return true;
49*bbecb9d1SAndroid Build Coastguard Worker }
50*bbecb9d1SAndroid Build Coastguard Worker 
vrend_get_tweak_is_active(struct vrend_context_tweaks * ctx,enum vrend_tweak_type t)51*bbecb9d1SAndroid Build Coastguard Worker bool vrend_get_tweak_is_active(struct vrend_context_tweaks *ctx, enum vrend_tweak_type t)
52*bbecb9d1SAndroid Build Coastguard Worker {
53*bbecb9d1SAndroid Build Coastguard Worker    return (ctx->active_tweaks & (1u << t)) ? true : false;
54*bbecb9d1SAndroid Build Coastguard Worker }
55*bbecb9d1SAndroid Build Coastguard Worker 
56*bbecb9d1SAndroid Build Coastguard Worker const char *tweak_debug_table[] = {
57*bbecb9d1SAndroid Build Coastguard Worker    [virgl_tweak_gles_brga_emulate] =
58*bbecb9d1SAndroid Build Coastguard Worker    "(non-functional) GLES: Skip linearization in blits to BGRA_UNORM surfaces",
59*bbecb9d1SAndroid Build Coastguard Worker 
60*bbecb9d1SAndroid Build Coastguard Worker    [virgl_tweak_gles_brga_apply_dest_swizzle] =
61*bbecb9d1SAndroid Build Coastguard Worker    "(non-functional) GLES: Apply dest swizzle when a BGRA surface is emulated by an RGBA surface",
62*bbecb9d1SAndroid Build Coastguard Worker 
63*bbecb9d1SAndroid Build Coastguard Worker    [virgl_tweak_gles_tf3_samples_passes_multiplier] =
64*bbecb9d1SAndroid Build Coastguard Worker     "GLES: Value to return when emulating GL_SAMPLES_PASSES by using GL_ANY_SAMPLES_PASSES",
65*bbecb9d1SAndroid Build Coastguard Worker 
66*bbecb9d1SAndroid Build Coastguard Worker    [virgl_tweak_undefined] = "Undefined tweak"
67*bbecb9d1SAndroid Build Coastguard Worker };
68*bbecb9d1SAndroid Build Coastguard Worker 
set_tweak_and_params(struct vrend_context_tweaks * ctx,enum vrend_tweak_type t,uint32_t value)69*bbecb9d1SAndroid Build Coastguard Worker static void set_tweak_and_params(struct vrend_context_tweaks *ctx,
70*bbecb9d1SAndroid Build Coastguard Worker                                  enum vrend_tweak_type t, uint32_t value)
71*bbecb9d1SAndroid Build Coastguard Worker {
72*bbecb9d1SAndroid Build Coastguard Worker    ctx->active_tweaks |= 1u << t;
73*bbecb9d1SAndroid Build Coastguard Worker 
74*bbecb9d1SAndroid Build Coastguard Worker    switch (t) {
75*bbecb9d1SAndroid Build Coastguard Worker    case virgl_tweak_gles_tf3_samples_passes_multiplier:
76*bbecb9d1SAndroid Build Coastguard Worker       ctx->tf3_samples_passed_factor = value;
77*bbecb9d1SAndroid Build Coastguard Worker       break;
78*bbecb9d1SAndroid Build Coastguard Worker    default:
79*bbecb9d1SAndroid Build Coastguard Worker       ;
80*bbecb9d1SAndroid Build Coastguard Worker    }
81*bbecb9d1SAndroid Build Coastguard Worker }
82*bbecb9d1SAndroid Build Coastguard Worker 
set_tweak_and_params_from_string(struct vrend_context_tweaks * ctx,enum vrend_tweak_type t,const char * value)83*bbecb9d1SAndroid Build Coastguard Worker static void set_tweak_and_params_from_string(struct vrend_context_tweaks *ctx,
84*bbecb9d1SAndroid Build Coastguard Worker                                              enum vrend_tweak_type t, const char *value)
85*bbecb9d1SAndroid Build Coastguard Worker {
86*bbecb9d1SAndroid Build Coastguard Worker    ctx->active_tweaks |= 1u << t;
87*bbecb9d1SAndroid Build Coastguard Worker 
88*bbecb9d1SAndroid Build Coastguard Worker    switch (t) {
89*bbecb9d1SAndroid Build Coastguard Worker    case virgl_tweak_gles_tf3_samples_passes_multiplier:
90*bbecb9d1SAndroid Build Coastguard Worker       ctx->tf3_samples_passed_factor = value ? atoi(value) : 2048;
91*bbecb9d1SAndroid Build Coastguard Worker       break;
92*bbecb9d1SAndroid Build Coastguard Worker    default:
93*bbecb9d1SAndroid Build Coastguard Worker       ;
94*bbecb9d1SAndroid Build Coastguard Worker    }
95*bbecb9d1SAndroid Build Coastguard Worker }
96*bbecb9d1SAndroid Build Coastguard Worker 
97*bbecb9d1SAndroid Build Coastguard Worker /* we expect a string like tweak1:value,tweak2:value */
vrend_set_active_tweaks(struct vrend_context_tweaks * ctx,uint32_t tweak_id,uint32_t value)98*bbecb9d1SAndroid Build Coastguard Worker void vrend_set_active_tweaks(struct vrend_context_tweaks *ctx, uint32_t tweak_id, uint32_t value)
99*bbecb9d1SAndroid Build Coastguard Worker {
100*bbecb9d1SAndroid Build Coastguard Worker    if (tweak_id < virgl_tweak_undefined) {
101*bbecb9d1SAndroid Build Coastguard Worker       VREND_DEBUG(dbg_tweak, NULL, "Apply tweak '%s' = %u\n", tweak_debug_table[tweak_id], value);
102*bbecb9d1SAndroid Build Coastguard Worker       set_tweak_and_params(ctx, tweak_id, value);
103*bbecb9d1SAndroid Build Coastguard Worker    } else {
104*bbecb9d1SAndroid Build Coastguard Worker       VREND_DEBUG(dbg_tweak, NULL, "Unknown tweak %d = %d sent\n", tweak_id, value);
105*bbecb9d1SAndroid Build Coastguard Worker    }
106*bbecb9d1SAndroid Build Coastguard Worker }
107*bbecb9d1SAndroid Build Coastguard Worker 
108*bbecb9d1SAndroid Build Coastguard Worker struct {
109*bbecb9d1SAndroid Build Coastguard Worker    enum vrend_tweak_type flag;
110*bbecb9d1SAndroid Build Coastguard Worker    const char *name;
111*bbecb9d1SAndroid Build Coastguard Worker    const char *descr;
112*bbecb9d1SAndroid Build Coastguard Worker } tweak_table [] = {
113*bbecb9d1SAndroid Build Coastguard Worker    { virgl_tweak_gles_brga_emulate, "emu-bgra",
114*bbecb9d1SAndroid Build Coastguard Worker      "(non-functional) Emulate BGRA_UNORM and BGRA_SRB by using swizzled RGBA formats" },
115*bbecb9d1SAndroid Build Coastguard Worker 
116*bbecb9d1SAndroid Build Coastguard Worker    { virgl_tweak_gles_brga_apply_dest_swizzle, "bgra-dest-swz",
117*bbecb9d1SAndroid Build Coastguard Worker      "(non-functional) Apply the destination swizzle of emulated BGRA surfaces in blits"},
118*bbecb9d1SAndroid Build Coastguard Worker 
119*bbecb9d1SAndroid Build Coastguard Worker    { virgl_tweak_gles_tf3_samples_passes_multiplier, "samples-passed",
120*bbecb9d1SAndroid Build Coastguard Worker      "Return this value when GL_SAMPLES_PASSED is emulated by GL_ANY_SAMPLES_PASSED"},
121*bbecb9d1SAndroid Build Coastguard Worker 
122*bbecb9d1SAndroid Build Coastguard Worker    { virgl_tweak_undefined, NULL, NULL}
123*bbecb9d1SAndroid Build Coastguard Worker };
124*bbecb9d1SAndroid Build Coastguard Worker 
125*bbecb9d1SAndroid Build Coastguard Worker 
vrend_set_tweak_from_env(struct vrend_context_tweaks * ctx)126*bbecb9d1SAndroid Build Coastguard Worker void vrend_set_tweak_from_env(struct vrend_context_tweaks *ctx)
127*bbecb9d1SAndroid Build Coastguard Worker {
128*bbecb9d1SAndroid Build Coastguard Worker    char *tweaks = getenv("VREND_TWEAK");
129*bbecb9d1SAndroid Build Coastguard Worker    if (tweaks) {
130*bbecb9d1SAndroid Build Coastguard Worker       VREND_DEBUG(dbg_tweak, NULL, "ENV tweaks %s\n", tweaks);
131*bbecb9d1SAndroid Build Coastguard Worker 
132*bbecb9d1SAndroid Build Coastguard Worker       char *saveptr;
133*bbecb9d1SAndroid Build Coastguard Worker       char *tweak_descr_copy = strdup(tweaks);
134*bbecb9d1SAndroid Build Coastguard Worker 
135*bbecb9d1SAndroid Build Coastguard Worker       char *tweak = strtok_r(tweak_descr_copy, ":", &saveptr);
136*bbecb9d1SAndroid Build Coastguard Worker       while (tweak) {
137*bbecb9d1SAndroid Build Coastguard Worker          char *tweak_param = strtok_r(NULL, ",", &saveptr);
138*bbecb9d1SAndroid Build Coastguard Worker 
139*bbecb9d1SAndroid Build Coastguard Worker          for (int i = 0; i < virgl_tweak_undefined; ++i) {
140*bbecb9d1SAndroid Build Coastguard Worker             if (!strcmp(tweak, tweak_table[i].name)) {
141*bbecb9d1SAndroid Build Coastguard Worker                VREND_DEBUG(dbg_tweak, NULL, "Apply tweak %s=%s\n", tweak, tweak_param);
142*bbecb9d1SAndroid Build Coastguard Worker                set_tweak_and_params_from_string(ctx, tweak_table[i].flag, tweak_param);
143*bbecb9d1SAndroid Build Coastguard Worker             }
144*bbecb9d1SAndroid Build Coastguard Worker          }
145*bbecb9d1SAndroid Build Coastguard Worker          tweak = strtok_r(NULL, ":", &saveptr);
146*bbecb9d1SAndroid Build Coastguard Worker       }
147*bbecb9d1SAndroid Build Coastguard Worker       free(tweak_descr_copy);
148*bbecb9d1SAndroid Build Coastguard Worker    }
149*bbecb9d1SAndroid Build Coastguard Worker }
150