xref: /aosp_15_r20/external/mesa3d/src/gallium/drivers/freedreno/a5xx/fd5_screen.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright © 2016 Rob Clark <[email protected]>
3  * SPDX-License-Identifier: MIT
4  *
5  * Authors:
6  *    Rob Clark <[email protected]>
7  */
8 
9 #include "pipe/p_screen.h"
10 #include "util/format/u_format.h"
11 
12 #include "fd5_blitter.h"
13 #include "fd5_context.h"
14 #include "fd5_emit.h"
15 #include "fd5_format.h"
16 #include "fd5_resource.h"
17 #include "fd5_screen.h"
18 
19 #include "ir3/ir3_compiler.h"
20 
21 static bool
valid_sample_count(unsigned sample_count)22 valid_sample_count(unsigned sample_count)
23 {
24    switch (sample_count) {
25    case 0:
26    case 1:
27    case 2:
28    case 4:
29       return true;
30    default:
31       return false;
32    }
33 }
34 
35 static bool
fd5_screen_is_format_supported(struct pipe_screen * pscreen,enum pipe_format format,enum pipe_texture_target target,unsigned sample_count,unsigned storage_sample_count,unsigned usage)36 fd5_screen_is_format_supported(struct pipe_screen *pscreen,
37                                enum pipe_format format,
38                                enum pipe_texture_target target,
39                                unsigned sample_count,
40                                unsigned storage_sample_count, unsigned usage)
41 {
42    unsigned retval = 0;
43 
44    if ((target >= PIPE_MAX_TEXTURE_TYPES) ||
45        !valid_sample_count(sample_count)) {
46       DBG("not supported: format=%s, target=%d, sample_count=%d, usage=%x",
47           util_format_name(format), target, sample_count, usage);
48       return false;
49    }
50 
51    if (MAX2(1, sample_count) != MAX2(1, storage_sample_count))
52       return false;
53 
54    if ((usage & PIPE_BIND_VERTEX_BUFFER) &&
55        (fd5_pipe2vtx(format) != VFMT5_NONE)) {
56       retval |= PIPE_BIND_VERTEX_BUFFER;
57    }
58 
59    if ((usage & (PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_SHADER_IMAGE)) &&
60        (fd5_pipe2tex(format) != TFMT5_NONE) &&
61        (target == PIPE_BUFFER || util_format_get_blocksize(format) != 12)) {
62       retval |= usage & (PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_SHADER_IMAGE);
63    }
64 
65    if ((usage &
66         (PIPE_BIND_RENDER_TARGET | PIPE_BIND_DISPLAY_TARGET |
67          PIPE_BIND_SCANOUT | PIPE_BIND_SHARED | PIPE_BIND_COMPUTE_RESOURCE)) &&
68        (fd5_pipe2color(format) != RB5_NONE) &&
69        (fd5_pipe2tex(format) != TFMT5_NONE)) {
70       retval |= usage & (PIPE_BIND_RENDER_TARGET | PIPE_BIND_DISPLAY_TARGET |
71                          PIPE_BIND_SCANOUT | PIPE_BIND_SHARED |
72                          PIPE_BIND_COMPUTE_RESOURCE);
73    }
74 
75    if (usage & PIPE_BIND_SHADER_IMAGE) {
76       if (sample_count > 1)
77          return false;
78    }
79 
80    /* For ARB_framebuffer_no_attachments: */
81    if ((usage & PIPE_BIND_RENDER_TARGET) && (format == PIPE_FORMAT_NONE)) {
82       retval |= usage & PIPE_BIND_RENDER_TARGET;
83    }
84 
85    if ((usage & PIPE_BIND_DEPTH_STENCIL) &&
86        (fd5_pipe2depth(format) != (enum a5xx_depth_format) ~0) &&
87        (fd5_pipe2tex(format) != TFMT5_NONE)) {
88       retval |= PIPE_BIND_DEPTH_STENCIL;
89    }
90 
91    if ((usage & PIPE_BIND_INDEX_BUFFER) &&
92        (fd_pipe2index(format) != (enum pc_di_index_size) ~0)) {
93       retval |= PIPE_BIND_INDEX_BUFFER;
94    }
95 
96    if (retval != usage) {
97       DBG("not supported: format=%s, target=%d, sample_count=%d, "
98           "usage=%x, retval=%x",
99           util_format_name(format), target, sample_count, usage, retval);
100    }
101 
102    return retval == usage;
103 }
104 
105 /* clang-format off */
106 static const enum pc_di_primtype primtypes[] = {
107    [MESA_PRIM_POINTS]         = DI_PT_POINTLIST,
108    [MESA_PRIM_LINES]          = DI_PT_LINELIST,
109    [MESA_PRIM_LINE_STRIP]     = DI_PT_LINESTRIP,
110    [MESA_PRIM_LINE_LOOP]      = DI_PT_LINELOOP,
111    [MESA_PRIM_TRIANGLES]      = DI_PT_TRILIST,
112    [MESA_PRIM_TRIANGLE_STRIP] = DI_PT_TRISTRIP,
113    [MESA_PRIM_TRIANGLE_FAN]   = DI_PT_TRIFAN,
114    [MESA_PRIM_COUNT]            = DI_PT_RECTLIST,  /* internal clear blits */
115 };
116 /* clang-format on */
117 
118 void
fd5_screen_init(struct pipe_screen * pscreen)119 fd5_screen_init(struct pipe_screen *pscreen)
120 {
121    struct fd_screen *screen = fd_screen(pscreen);
122    screen->max_rts = A5XX_MAX_RENDER_TARGETS;
123    pscreen->context_create = fd5_context_create;
124    pscreen->is_format_supported = fd5_screen_is_format_supported;
125 
126    screen->setup_slices = fd5_setup_slices;
127    if (FD_DBG(TTILE))
128       screen->tile_mode = fd5_tile_mode;
129 
130    fd5_emit_init_screen(pscreen);
131    ir3_screen_init(pscreen);
132 
133    screen->primtypes = primtypes;
134 }
135