aboutsummaryrefslogtreecommitdiff
path: root/src/mesa/drivers/verite/libv3d.h
blob: 4ee44b11b971e9b06281ae06a7a618d077bec2c3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/*
 * Copyright (c) 2026 The NetBSD Foundation, Inc.
 * All rights reserved.
 *
 * This code is derived from software contributed to The NetBSD Foundation
 * by Radoslaw Kujawa.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

/*
 * libv3d - thin userland layer over /dev/verite3d (verite3dio.h),
 * shaped after the RRedline command-buffer model. Uses the v2000gl.uc 
 * command numbers (sync=8, context_init=2, exit=0) and the decoded 
 * state-class words.
 */
#ifndef LIBV3D_H
#define LIBV3D_H

#include <stdint.h>
#include "verite3dio.h"

/*
 * Perf counters
 */
struct v3d_stats {
	uint64_t	words;		/* words emitted into slots */
	uint64_t	submits, submit_bytes, submit_ns;
	uint64_t	syncs, sync_ns;
	uint64_t	flips, flip_ns;
	uint64_t	uploads, upload_bytes;
	uint64_t	st_calls, texbinds;
};

struct v3d {
	int		fd;
	uint32_t	*slot[V3D_RING_SLOTS];
	uint8_t		*vram;		/* lazy full-VRAM read mapping */
	int		cur;		/* slot being filled */
	uint32_t	n;		/* words used in cur */
	/* geometry from the kernel */
	uint32_t	ctx_base, memsize, pool_base;
	uint32_t	width, height, stride, pe_stride;
	/* RLGL_STATS / RLGL_NULLDRAW / RLGL_NOSYNC / RLGL_NOFLIP /
	 * RLGL_TEARFLIP */
	int		opt_stats, opt_nulldraw, opt_nosync, opt_noflip;
	int		opt_tearflip;
	struct v3d_stats st;
};

/* GL blob FIFO ABI */
#define V3D_GL_EXIT		0
#define V3D_GL_CTX_INIT		2
#define V3D_GL_SYNC		8
#define V3D_GL_MEM_WRITE	9
#define V3D_GL_CLEAR_RECT	13
#define V3D_GL_LINE		16	/* hw Bresenham line (rdraw2) */
#define V3D_GL_AALINE		20	/* coverage-graded AA line */
#define V3D_GL_TRIANGLE		24
#define V3D_GL_TRISTRIP		26	/* hw tri-strip start (cont word 48) */
#define V3D_GL_TRIFAN		27	/* hw tri-fan start (cont word 49) */
#define V3D_GL_AAPOINT		50	/* coverage-graded AA point */
#define V3D_GL_STRIP_CONT	48	/* tristrip_third_vertex continuation */
#define V3D_GL_FAN_CONT		49	/* trifan continuation (single vtx) */

/* PE register indices (state class 1 writes, value pre-shifted) */
#define V3D_PE_SRCBASE		0
#define V3D_PE_STRIDE		3
#define V3D_PE_DSTBASE		4
#define V3D_PE_DSTFMT		6
#define V3D_PE_PMASK		7
#define V3D_PE_SCISSORX		14
#define V3D_PE_SCISSORY		15
#define V3D_PE_ZBASE		16
#define V3D_PE_FGCOLOR		19
#define V3D_PE_FOGCOLOR		21	/* 0x00RRGGBB */
#define V3D_PE_SRCFMT		48
#define V3D_PE_SRCFUNC		49	/* value << 4 */
#define V3D_PE_SRCFILTER	50	/* value << 7 */
#define V3D_PE_ALUMODE		64	/* bits 3:0 */
#define V3D_PE_BLENDSRCFUNC	65	/* value << 4 */
#define V3D_PE_BLENDDSTFUNC	66	/* value << 8 */
#define V3D_PE_ZBUFMODE		67	/* value << 12 */
#define V3D_PE_ZBUFWRMODE	68	/* value << 16 */
#define V3D_PE_BLENDENABLE	70	/* value << 19 */
#define V3D_PE_DITHEREN		71	/* value << 20 */
#define V3D_PE_FOGEN		72	/* value << 21 */
#define V3D_PE_DSTRDDIS		74	/* value << 23 */

uint64_t v3d_now_ns(void);
int	v3d_open(struct v3d *, const char *devpath, const char *ucpath);
void	v3d_close(struct v3d *);
/*
 * VRAM window
 */
const uint8_t *v3d_vram(struct v3d *);
void	v3d_emit(struct v3d *, const uint32_t *, uint32_t);
void	v3d_emit1(struct v3d *, uint32_t);
void	v3d_emitf(struct v3d *, float);

uint32_t *v3d_reserve(struct v3d *, uint32_t nwords);
void	v3d_commit(struct v3d *, uint32_t nwords);
int	v3d_flush(struct v3d *);
int	v3d_sync(struct v3d *);
int	v3d_alloc(struct v3d *, uint32_t, uint32_t, uint32_t *);
int	v3d_mode(struct v3d *, uint32_t depth, uint32_t frame_base);
int	v3d_flip(struct v3d *, uint32_t frame_base);

/* state class 1: single PE register write (pre-shifted value) */
void	v3d_st(struct v3d *, uint32_t reg, uint32_t val);
/* state class 4: full texture bind */
void	v3d_texbind(struct v3d *, uint32_t addr, uint32_t srcstride,
	    uint32_t w, uint32_t h, uint32_t uscale, uint32_t vscale);
/* mem_write upload (chunks as needed) and engine-side clear */
int	v3d_upload(struct v3d *, uint32_t dst, const void *, uint32_t);
void	v3d_clear(struct v3d *, uint32_t addr, uint32_t stride,
	    uint32_t wbytes, uint32_t h, uint32_t val);

#endif /* LIBV3D_H */