Subversion Repositories Kolibri OS

Rev

Rev 4359 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4359 Rev 4501
Line 36... Line 36...
36
 
36
 
37
#ifndef sse2
37
#ifndef sse2
38
#define sse2
38
#define sse2
Line -... Line 39...
-
 
39
#endif
-
 
40
 
-
 
41
void gen4_vertex_align(struct sna *sna, const struct sna_composite_op *op)
-
 
42
{
-
 
43
	int vertex_index;
-
 
44
 
-
 
45
	assert(op->floats_per_rect == 3*op->floats_per_vertex);
-
 
46
 
-
 
47
	vertex_index = (sna->render.vertex_used + op->floats_per_vertex - 1) / op->floats_per_vertex;
-
 
48
	if ((int)sna->render.vertex_size - vertex_index * op->floats_per_vertex < 2*op->floats_per_rect) {
-
 
49
		DBG(("%s: flushing vertex buffer: new index=%d, max=%d\n",
-
 
50
		     __FUNCTION__, vertex_index, sna->render.vertex_size / op->floats_per_vertex));
-
 
51
		if (gen4_vertex_finish(sna) < op->floats_per_rect) {
-
 
52
			kgem_submit(&sna->kgem);
-
 
53
			_kgem_set_mode(&sna->kgem, KGEM_RENDER);
-
 
54
		}
-
 
55
 
-
 
56
		vertex_index = (sna->render.vertex_used + op->floats_per_vertex - 1) / op->floats_per_vertex;
-
 
57
		assert(vertex_index * op->floats_per_vertex <= sna->render.vertex_size);
-
 
58
	}
-
 
59
 
-
 
60
	sna->render.vertex_index = vertex_index;
-
 
61
	sna->render.vertex_used = vertex_index * op->floats_per_vertex;
39
#endif
62
}
40
 
63
 
41
void gen4_vertex_flush(struct sna *sna)
64
void gen4_vertex_flush(struct sna *sna)
42
{
65
{
43
    DBG(("%s[%x] = %d\n", __FUNCTION__,
66
    DBG(("%s[%x] = %d\n", __FUNCTION__,
Line 44... Line 67...
44
         4*sna->render.vertex_offset,
67
         4*sna->render.vertex_offset,
-
 
68
         sna->render.vertex_index - sna->render.vertex_start));
45
         sna->render.vertex_index - sna->render.vertex_start));
69
 
-
 
70
    assert(sna->render.vertex_offset);
Line 46... Line 71...
46
 
71
	assert(sna->render.vertex_offset <= sna->kgem.nbatch);
47
    assert(sna->render.vertex_offset);
72
    assert(sna->render.vertex_index > sna->render.vertex_start);
48
    assert(sna->render.vertex_index > sna->render.vertex_start);
73
	assert(sna->render.vertex_used <= sna->render.vertex_size);
49
 
74
 
Line 60... Line 85...
60
 
85
 
61
    DBG(("%s: used=%d / %d\n", __FUNCTION__,
86
    DBG(("%s: used=%d / %d\n", __FUNCTION__,
62
         sna->render.vertex_used, sna->render.vertex_size));
87
         sna->render.vertex_used, sna->render.vertex_size));
63
    assert(sna->render.vertex_offset == 0);
88
    assert(sna->render.vertex_offset == 0);
-
 
89
    assert(sna->render.vertex_used);
Line 64... Line 90...
64
    assert(sna->render.vertex_used);
90
	assert(sna->render.vertex_used <= sna->render.vertex_size);
Line 65... Line 91...
65
 
91
 
Line -... Line 92...
-
 
92
	sna_vertex_wait__locked(&sna->render);
-
 
93
 
66
	sna_vertex_wait__locked(&sna->render);
94
    /* Note: we only need dword alignment (currently) */
67
 
95
 
68
    /* Note: we only need dword alignment (currently) */
96
	hint = CREATE_GTT_MAP;
69
 
97
 
70
    bo = sna->render.vbo;
98
    bo = sna->render.vbo;
Line 86... Line 114...
86
        sna->render.vertex_index = 0;
114
        sna->render.vertex_index = 0;
87
        sna->render.vbo = NULL;
115
        sna->render.vbo = NULL;
88
        sna->render.vb_id = 0;
116
        sna->render.vb_id = 0;
Line 89... Line 117...
89
 
117
 
-
 
118
        kgem_bo_destroy(&sna->kgem, bo);
-
 
119
		hint |= CREATE_CACHED | CREATE_NO_THROTTLE;
-
 
120
	} else {
-
 
121
		if (kgem_is_idle(&sna->kgem)) {
-
 
122
			sna->render.vertices = sna->render.vertex_data;
-
 
123
			sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data);
-
 
124
			return 0;
90
        kgem_bo_destroy(&sna->kgem, bo);
125
		}
Line 91... Line -...
91
    }
-
 
92
 
-
 
93
    hint = CREATE_GTT_MAP;
-
 
Line 94... Line 126...
94
    if (bo)
126
    }
95
        hint |= CREATE_CACHED | CREATE_NO_THROTTLE;
127
 
96
 
128
 
97
    size = 256*1024;
129
    size = 256*1024;
Line 161... Line 193...
161
            DBG(("%s: discarding vbo (full), handle=%d\n", __FUNCTION__, sna->render.vbo->handle));
193
            DBG(("%s: discarding vbo (full), handle=%d\n", __FUNCTION__, sna->render.vbo->handle));
162
            sna->render.vbo = NULL;
194
            sna->render.vbo = NULL;
163
            sna->render.vertices = sna->render.vertex_data;
195
            sna->render.vertices = sna->render.vertex_data;
164
            sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data);
196
            sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data);
165
            free_bo = bo;
197
            free_bo = bo;
166
        } else if (IS_CPU_MAP(bo->map) && !sna->kgem.has_llc) {
198
		} else if (!sna->kgem.has_llc && sna->render.vertices == MAP(bo->map__cpu)) {
167
            DBG(("%s: converting CPU map to GTT\n", __FUNCTION__));
199
            DBG(("%s: converting CPU map to GTT\n", __FUNCTION__));
168
            sna->render.vertices =
200
            sna->render.vertices =
169
                kgem_bo_map__gtt(&sna->kgem, sna->render.vbo);
201
                kgem_bo_map__gtt(&sna->kgem, sna->render.vbo);
170
            if (sna->render.vertices == NULL) {
202
            if (sna->render.vertices == NULL) {
171
                sna->render.vbo = NULL;
203
                sna->render.vbo = NULL;
Line 174... Line 206...
174
                free_bo = bo;
206
                free_bo = bo;
175
            }
207
            }
Line 176... Line 208...
176
 
208
 
177
        }
209
        }
-
 
210
    } else {
-
 
211
		int size;
-
 
212
 
178
    } else {
213
		size  = sna->kgem.nbatch;
-
 
214
		size += sna->kgem.batch_size - sna->kgem.surface;
-
 
215
		size += sna->render.vertex_used;
-
 
216
 
179
        if (sna->kgem.nbatch + sna->render.vertex_used <= sna->kgem.surface) {
217
		if (size <= 1024) {
180
            DBG(("%s: copy to batch: %d @ %d\n", __FUNCTION__,
218
            DBG(("%s: copy to batch: %d @ %d\n", __FUNCTION__,
-
 
219
                 sna->render.vertex_used, sna->kgem.nbatch));
181
                 sna->render.vertex_used, sna->kgem.nbatch));
220
			assert(sna->kgem.nbatch + sna->render.vertex_used <= sna->kgem.surface);
182
            memcpy(sna->kgem.batch + sna->kgem.nbatch,
221
            memcpy(sna->kgem.batch + sna->kgem.nbatch,
183
                   sna->render.vertex_data,
222
                   sna->render.vertex_data,
184
                   sna->render.vertex_used * 4);
223
                   sna->render.vertex_used * 4);
185
            delta = sna->kgem.nbatch * 4;
224
            delta = sna->kgem.nbatch * 4;
186
            bo = NULL;
225
            bo = NULL;
187
            sna->kgem.nbatch += sna->render.vertex_used;
226
            sna->kgem.nbatch += sna->render.vertex_used;
-
 
227
        } else {
-
 
228
			size = 256 * 1024;
-
 
229
			do {
-
 
230
				bo = kgem_create_linear(&sna->kgem, size,
-
 
231
							CREATE_GTT_MAP | CREATE_NO_RETIRE | CREATE_NO_THROTTLE | CREATE_CACHED);
-
 
232
			} while (bo == NULL && (size>>=1) > sizeof(float)*sna->render.vertex_used);
-
 
233
 
-
 
234
			sna->render.vertices = NULL;
-
 
235
			if (bo)
-
 
236
				sna->render.vertices = kgem_bo_map(&sna->kgem, bo);
-
 
237
			if (sna->render.vertices != NULL) {
-
 
238
				DBG(("%s: new vbo: %d / %d\n", __FUNCTION__,
-
 
239
				     sna->render.vertex_used, __kgem_bo_size(bo)/4));
-
 
240
 
-
 
241
				assert(sizeof(float)*sna->render.vertex_used <= __kgem_bo_size(bo));
-
 
242
				memcpy(sna->render.vertices,
-
 
243
				       sna->render.vertex_data,
-
 
244
				       sizeof(float)*sna->render.vertex_used);
-
 
245
 
-
 
246
				size = __kgem_bo_size(bo)/4;
-
 
247
				if (size >= UINT16_MAX)
-
 
248
					size = UINT16_MAX - 1;
-
 
249
 
-
 
250
				sna->render.vbo = bo;
-
 
251
				sna->render.vertex_size = size;
-
 
252
			} else {
-
 
253
				DBG(("%s: tmp vbo: %d\n", __FUNCTION__,
-
 
254
				     sna->render.vertex_used));
-
 
255
 
-
 
256
				if (bo)
-
 
257
					kgem_bo_destroy(&sna->kgem, bo);
188
        } else {
258
 
189
            bo = kgem_create_linear(&sna->kgem,
259
            bo = kgem_create_linear(&sna->kgem,
190
                        4*sna->render.vertex_used,
260
                        4*sna->render.vertex_used,
191
                        CREATE_NO_THROTTLE);
261
                        CREATE_NO_THROTTLE);
192
            if (bo && !kgem_bo_write(&sna->kgem, bo,
262
            if (bo && !kgem_bo_write(&sna->kgem, bo,
193
                         sna->render.vertex_data,
263
                         sna->render.vertex_data,
194
                         4*sna->render.vertex_used)) {
264
                         4*sna->render.vertex_used)) {
195
                kgem_bo_destroy(&sna->kgem, bo);
265
                kgem_bo_destroy(&sna->kgem, bo);
196
                bo = NULL;
266
                bo = NULL;
-
 
267
            }
197
            }
268
 
198
            DBG(("%s: new vbo: %d\n", __FUNCTION__,
269
				assert(sna->render.vbo == NULL);
-
 
270
				sna->render.vertices = sna->render.vertex_data;
199
                 sna->render.vertex_used));
271
				sna->render.vertex_size = ARRAY_SIZE(sna->render.vertex_data);
200
            free_bo = bo;
272
            free_bo = bo;
201
        }
273
        }
-
 
274
    }
Line 202... Line 275...
202
    }
275
	}
203
 
276
 
204
    assert(sna->render.nvertex_reloc);
277
    assert(sna->render.nvertex_reloc);
205
    for (i = 0; i < sna->render.nvertex_reloc; i++) {
278
    for (i = 0; i < sna->render.nvertex_reloc; i++) {