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