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 */
|