Lines Matching defs:sna
32 #include "sna.h"
37 void gen8_vertex_align(struct sna *sna, const struct sna_composite_op *op)
43 vertex_index = (sna->render.vertex_used + op->floats_per_vertex - 1) / op->floats_per_vertex;
44 if ((int)sna->render.vertex_size - vertex_index * op->floats_per_vertex < 2*op->floats_per_rect) {
46 __FUNCTION__, vertex_index, sna->render.vertex_size / op->floats_per_vertex));
47 if (gen8_vertex_finish(sna) < 2*op->floats_per_rect) {
48 kgem_submit(&sna->kgem);
49 _kgem_set_mode(&sna->kgem, KGEM_RENDER);
52 vertex_index = (sna->render.vertex_used + op->floats_per_vertex - 1) / op->floats_per_vertex;
53 assert(vertex_index * op->floats_per_vertex <= sna->render.vertex_size);
56 sna->render.vertex_index = vertex_index;
57 sna->render.vertex_used = vertex_index * op->floats_per_vertex;
60 void gen8_vertex_flush(struct sna *sna)
63 4*sna->render.vertex_offset,
64 sna->render.vertex_index - sna->render.vertex_start));
66 assert(sna->render.vertex_offset);
67 assert(sna->render.vertex_offset <= sna->kgem.nbatch);
68 assert(sna->render.vertex_index > sna->render.vertex_start);
69 assert(sna->render.vertex_used <= sna->render.vertex_size);
71 sna->kgem.batch[sna->render.vertex_offset] =
72 sna->render.vertex_index - sna->render.vertex_start;
73 sna->render.vertex_offset = 0;
76 int gen8_vertex_finish(struct sna *sna)
83 sna->render.vertex_used, sna->render.vertex_size));
84 assert(sna->render.vertex_offset == 0);
85 assert(sna->render.vertex_used);
86 assert(sna->render.vertex_used <= sna->render.vertex_size);
88 sna_vertex_wait__locked(&sna->render);
94 bo = sna->render.vbo;
96 for (i = 0; i < sna->render.nvertex_reloc; i++) {
98 i, sna->render.vertex_reloc[i]));
100 *(uint64_t *)(sna->kgem.batch+sna->render.vertex_reloc[i]) =
101 kgem_add_reloc64(&sna->kgem,
102 sna->render.vertex_reloc[i], bo,
107 assert(!sna->render.active);
108 sna->render.nvertex_reloc = 0;
109 sna->render.vertex_used = 0;
110 sna->render.vertex_index = 0;
111 sna->render.vbo = NULL;
112 sna->render.vb_id = 0;
114 kgem_bo_destroy(&sna->kgem, bo);
117 if (kgem_is_idle(&sna->kgem)) {
118 sna->render.vertices = sna->render.vertex_data;
119 sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data);
125 assert(!sna->render.active);
126 sna->render.vertices = NULL;
127 sna->render.vbo = kgem_create_linear(&sna->kgem, size, hint);
128 while (sna->render.vbo == NULL && size > 16*1024) {
130 sna->render.vbo = kgem_create_linear(&sna->kgem, size, hint);
132 if (sna->render.vbo == NULL)
133 sna->render.vbo = kgem_create_linear(&sna->kgem,
135 if (sna->render.vbo)
136 sna->render.vertices = kgem_bo_map(&sna->kgem, sna->render.vbo);
137 if (sna->render.vertices == NULL) {
138 if (sna->render.vbo) {
139 kgem_bo_destroy(&sna->kgem, sna->render.vbo);
140 sna->render.vbo = NULL;
142 sna->render.vertices = sna->render.vertex_data;
143 sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data);
147 if (sna->render.vertex_used) {
150 sna->render.vertex_used,
151 sna->render.vbo->handle));
152 assert(sizeof(float)*sna->render.vertex_used <=
153 __kgem_bo_size(sna->render.vbo));
154 memcpy(sna->render.vertices,
155 sna->render.vertex_data,
156 sizeof(float)*sna->render.vertex_used);
159 size = __kgem_bo_size(sna->render.vbo)/4;
164 __FUNCTION__, sna->render.vbo->handle, size));
166 sna->render.vertex_size = size;
167 return sna->render.vertex_size - sna->render.vertex_used;
170 void gen8_vertex_close(struct sna *sna)
175 assert(sna->render.vertex_offset == 0);
176 if (!sna->render.vb_id)
180 __FUNCTION__, sna->render.vertex_used, sna->render.vbo ? sna->render.vbo->handle : 0,
181 sna->render.vb_id, sna->render.nvertex_reloc));
183 assert(!sna->render.active);
185 bo = sna->render.vbo;
187 if (sna->render.vertex_size - sna->render.vertex_used < 64) {
188 DBG(("%s: discarding vbo (full), handle=%d\n", __FUNCTION__, sna->render.vbo->handle));
189 sna->render.vbo = NULL;
190 sna->render.vertices = sna->render.vertex_data;
191 sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data);
193 } else if (!sna->kgem.has_llc && sna->render.vertices == MAP(bo->map__cpu)) {
195 sna->render.vertices =
196 kgem_bo_map__gtt(&sna->kgem, sna->render.vbo);
197 if (sna->render.vertices == NULL) {
198 sna->render.vbo = NULL;
199 sna->render.vertices = sna->render.vertex_data;
200 sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data);
208 size = sna->kgem.nbatch;
209 size += sna->kgem.batch_size - sna->kgem.surface;
210 size += sna->render.vertex_used;
214 sna->render.vertex_used, sna->kgem.nbatch));
215 assert(sna->kgem.nbatch + sna->render.vertex_used <= sna->kgem.surface);
216 memcpy(sna->kgem.batch + sna->kgem.nbatch,
217 sna->render.vertex_data,
218 sna->render.vertex_used * 4);
219 delta = sna->kgem.nbatch * 4;
221 sna->kgem.nbatch += sna->render.vertex_used;
225 bo = kgem_create_linear(&sna->kgem, size,
227 } while (bo == NULL && (size>>=1) > sizeof(float)*sna->render.vertex_used);
229 sna->render.vertices = NULL;
231 sna->render.vertices = kgem_bo_map(&sna->kgem, bo);
232 if (sna->render.vertices != NULL) {
234 sna->render.vertex_used, __kgem_bo_size(bo)/4));
236 assert(sizeof(float)*sna->render.vertex_used <= __kgem_bo_size(bo));
237 memcpy(sna->render.vertices,
238 sna->render.vertex_data,
239 sizeof(float)*sna->render.vertex_used);
245 sna->render.vbo = bo;
246 sna->render.vertex_size = size;
249 sna->render.vertex_used));
252 kgem_bo_destroy(&sna->kgem, bo);
254 bo = kgem_create_linear(&sna->kgem,
255 4*sna->render.vertex_used,
257 if (bo && !kgem_bo_write(&sna->kgem, bo,
258 sna->render.vertex_data,
259 4*sna->render.vertex_used)) {
260 kgem_bo_destroy(&sna->kgem, bo);
264 assert(sna->render.vbo == NULL);
265 sna->render.vertices = sna->render.vertex_data;
266 sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data);
272 assert(sna->render.nvertex_reloc);
273 for (i = 0; i < sna->render.nvertex_reloc; i++) {
275 i, sna->render.vertex_reloc[i]));
277 *(uint64_t *)(sna->kgem.batch+sna->render.vertex_reloc[i]) =
278 kgem_add_reloc64(&sna->kgem,
279 sna->render.vertex_reloc[i], bo,
283 sna->render.nvertex_reloc = 0;
284 sna->render.vb_id = 0;
286 if (sna->render.vbo == NULL) {
287 assert(!sna->render.active);
288 sna->render.vertex_used = 0;
289 sna->render.vertex_index = 0;
290 assert(sna->render.vertices == sna->render.vertex_data);
291 assert(sna->render.vertex_size == ARRAY_SIZE(sna->render.vertex_data));
295 kgem_bo_destroy(&sna->kgem, free_bo);