aboutsummaryrefslogtreecommitdiff
path: root/src/mesa/drivers/verite/rlgl.h
blob: 002134c4c4bbe58d9a3776f9e309f3277aaab1f9 (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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
/*
 * 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.
 */

#ifndef RLGL_H
#define RLGL_H

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

/* texel formats (PE SrcFmt/DstFmt encodings) */
#define RLGL_FMT_565	4
#define RLGL_FMT_4444	5
#define RLGL_FMT_1555	6

/*
 * blend factors
 */
#define RLGL_BL_ZERO		6	/* Blend0 */
#define RLGL_BL_ONE		7	/* Blend1 */
#define RLGL_BL_SRCALPHA	2
#define RLGL_BL_INVSRCALPHA	3
#define RLGL_BL_OTHERCOLOR	0	/* dst side: src color; src: dst */
#define RLGL_BL_INVOTHERCOLOR	1
#define RLGL_BL_OWNCOLOR	10	/* own color - no GL equivalent */
#define RLGL_BL_INVOWNCOLOR	11
/* legacy names (dst-side view), kept for minigl */
#define RLGL_BL_SRCCOLOR	RLGL_BL_OTHERCOLOR
#define RLGL_BL_INVSRCCOLOR	RLGL_BL_INVOTHERCOLOR

struct rlgl_tex {
	uint32_t	addr;		/* VRAM; 0 = not resident */
	uint16_t	w, h;		/* texels, powers of two */
	uint32_t	srcstride;	/* encoded (Src1<<4)|Src0 */
	uint32_t	fmt;		/* RLGL_FMT_* */
};

struct rlgl {
	struct v3d	v;
	uint32_t	fb[2], zbuf;
	uint32_t	scratch;	/* glCopyPixels seed scratch surface */
	int		back;
	struct rlgl_tex	pt_tex;		/* AA-point radial coverage tex (lazy;
					 * addr 0 = not yet created) */
	/* redundant-state cache */
	uint32_t	cur_tex;
	int		cur_func;	/* PE SrcFunc currently set */
	int		env_mod;	/* SrcFunc code for textured draws */
	int		fog_on;		/* emit the KFXYZUVQ fog channel */
	int		frames;
	/* perf: swap-to-swap frame timing (RLGL_STATS) + counters */
	uint64_t	tris;
	uint64_t	frame_ns_tot, frame_ns_min, frame_ns_max;
	uint64_t	last_swap_ns;
	int		stats_printed;
};

/* per-vertex layout handed to rlgl_tri: the KXYZUVQ order */
struct rlgl_vtx {
	float	r, g, b;	/* 0..255 */
	float	x, y;		/* screen pixels */
	float	z;		/* 0..65535, smaller = nearer */
	float	u, v;		/* texels */
	float	q;		/* 1/w (any consistent scale) */
	float	f;		/* fog factor 0..255, 255 = no fog (fog_on only) */
};

/* diagnostic: 1 = disable redundant-state caches (VRMESA_NOCACHE probe) */
extern int rlgl_force_rebind;

int	rlgl_init(struct rlgl *, const char *ucpath);
void	rlgl_shutdown(struct rlgl *);

int	rlgl_tex_init(struct rlgl_tex *, int w, int h, uint32_t fmt);
int	rlgl_tex_alloc(struct rlgl *, struct rlgl_tex *);
int	rlgl_tex_pyramid(struct rlgl *, struct rlgl_tex *levs, int nlev);
int	rlgl_tex_create(struct rlgl *, struct rlgl_tex *, int w, int h,
	    uint32_t fmt);
void	rlgl_tex_free(struct rlgl *, struct rlgl_tex *);
int	rlgl_tex_upload(struct rlgl *, struct rlgl_tex *,
	    const uint16_t *texels);
int	rlgl_tex_upload_rows(struct rlgl *, struct rlgl_tex *,
	    const uint16_t *texels, int y, int rows);
void	rlgl_tex_bind(struct rlgl *, const struct rlgl_tex *);
void	rlgl_tex_env(struct rlgl *, int modulate);
/* PE SrcFunc codes (spec table: 1=replace 2=decal 3=modulate) */
#define RLGL_ENV_REPLACE	1
#define RLGL_ENV_DECAL		2
#define RLGL_ENV_MODULATE	3
void	rlgl_tex_env_code(struct rlgl *, int srcfunc_code);
/*
 * Per-axis clamp-to-edge (UClamp b15 / VClamp b16 of SrcMode).
 */
void	rlgl_tex_wrap(struct rlgl *, int uclamp, int vclamp);
void	rlgl_tex_filter(struct rlgl *, int bilinear);

/* PE ZBufMode compare codes (silicon-proven: LT ztest, LE GLQuake) */
#define RLGL_Z_LT	1
#define RLGL_Z_LE	3

void	rlgl_depth_test(struct rlgl *, int enable_lt_or_le);
void	rlgl_depth_func(struct rlgl *, int enable, int pe_code);
void	rlgl_depth_mask(struct rlgl *, int write);
void	rlgl_blend(struct rlgl *, int enable, uint32_t srcf, uint32_t dstf);
void	rlgl_alpha_test(struct rlgl *, int enable, uint32_t thresh8);
/* GL window-coord box (bottom-left origin); flips to the PE top-left */
void	rlgl_scissor(struct rlgl *, int x, int y, int w, int h);
/* 565 plane write mask; args are glColorMask R/G/B booleans (alpha n/a) */
void	rlgl_color_mask(struct rlgl *, int r, int g, int b);
/* PE raster op (ALUMode 4-bit ROP code); disabled restores COPY */
void	rlgl_logic_op(struct rlgl *, int enable, int code);
/* PE 4x4 ordered dither on 565 writes (GL_DITHER) */
void	rlgl_dither(struct rlgl *, int enable);
/*
 * Per-vertex fog (GL_FOG)
 */
void	rlgl_fog(struct rlgl *, int enable, uint32_t rgb888);

void	rlgl_clear(struct rlgl *, int color, uint32_t rgb565,
	    int depth);
/*
 * glDrawPixels fast path
 */
int	rlgl_draw_row(struct rlgl *, int x, int wy, int w,
	    const uint16_t *row565);
/*
 * Hardware glCopyPixels (GL_COLOR)
 */
int	rlgl_copy_rect(struct rlgl *, uint32_t src_base, int src_w,
	    uint32_t dst_base, int dst_w, int sx, int sy, int dx, int dy,
	    int w, int h);
/*
 * Hardware glCopyTexSubImage
 */
int	rlgl_copy_to_tex(struct rlgl *, uint32_t fb_base, int fb_h,
	    uint32_t tex_base, int tex_aw, int sx, int sy_gl, int dx, int dy,
	    int w, int h);
void	rlgl_tri(struct rlgl *, const struct rlgl_vtx *,
	    const struct rlgl_vtx *, const struct rlgl_vtx *);
/*
 * Native hardware lines from a 2-vertex KXYZ stream (only r,g,b,x,y,z
 * used).
 */
void	rlgl_line(struct rlgl *, const struct rlgl_vtx *,
	    const struct rlgl_vtx *);
void	rlgl_aaline(struct rlgl *, const struct rlgl_vtx *,
	    const struct rlgl_vtx *);
/*
 * Native anti-aliased points (GL_POINT_SMOOTH)
 */
void	rlgl_aapoint_begin(struct rlgl *);
void	rlgl_aapoint(struct rlgl *, const struct rlgl_vtx *, float size);
void	rlgl_aapoint_end(struct rlgl *);
/*
 * Native hardware primitive strips/fans
 */
void	rlgl_tristrip(struct rlgl *, const struct rlgl_vtx *v, int n);
void	rlgl_trifan(struct rlgl *, const struct rlgl_vtx *v, int n);
/*
 * Bulk indexed emit: verts9 = packed 9-float wire records
 * (r,g,b,x,y,z,u,v,q), idx = 3*ntris vertex indices into verts9.
 */
void	rlgl_tris_idx(struct rlgl *, const float *verts9,
	    const uint8_t *idx, int ntris);
int	rlgl_swap(struct rlgl *);
int	rlgl_finish(struct rlgl *);
void	rlgl_stats_print(struct rlgl *);

#endif /* RLGL_H */