2 * Copyright (C) 2011, 2012 glevand <geoffrey.levand@mail.ru>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer,
10 * without modification, immediately at the beginning of the file.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 #define ARRAY_SIZE(_a) (sizeof(_a) / sizeof((_a)[0]))
33 #define ROUNDUP(_x, _y) ((((_x) + ((_y) - 1)) / (_y)) * (_y))
36 uint32_t sd_color_loc
[4];
37 uint32_t sd_color_off
[4];
38 uint32_t sd_color_pitch
[4];
40 uint8_t sd_color_target
;
41 uint32_t sd_depth_loc
;
42 uint32_t sd_depth_off
;
43 uint32_t sd_depth_pitch
;
67 memset32(void *buf
, uint32_t val
, int word_count
)
75 static inline uint32_t
76 get_channel_id(const volatile void *driver_info
)
78 return (*(uint32_t *) ((uint8_t *) driver_info
+ 0xc));
81 static inline uint32_t
82 get_label_area_offset(const volatile void *driver_info
)
84 return (*(uint32_t *) ((uint8_t *) driver_info
+ 0x30));
87 static inline uint32_t
88 get_report_data_area_offset(const volatile void *driver_info
)
90 return (*(uint32_t *) ((uint8_t *) driver_info
+ 0x34));
94 get_flip_status(const volatile void *driver_info
, uint8_t head
)
98 val
= *(uint32_t *) ((uint8_t *) driver_info
+ 0x10c0 + head
* 0x40);
104 wait_fifo_idle(volatile uint32_t *control
)
109 if (control
[0x10] == control
[0x11])
115 if (control
[0x10] != control
[0x11])
121 static inline uint32_t *
122 get_label_addr(const volatile void *driver_info
, const volatile void *reports
,
125 return ((uint32_t *) ((uint8_t *) reports
+
126 get_label_area_offset(driver_info
) + (index
<< 4)));
129 static inline uint32_t
130 get_label_value(const volatile void *driver_info
, const volatile void *reports
,
135 val
= *get_label_addr(driver_info
, reports
, index
);
140 static inline uint64_t *
141 get_timestamp_addr(const volatile void *driver_info
, const volatile void *reports
,
144 return ((uint64_t *) ((uint8_t *) reports
+
145 get_report_data_area_offset(driver_info
) + (index
<< 4)));
148 static inline uint64_t
149 get_timestamp_value(const volatile void *driver_info
, const volatile void *reports
,
154 val
= *get_timestamp_addr(driver_info
, reports
, index
);
159 int setup_control(int fd
, int context_id
, unsigned long put
, unsigned long get
,
162 int memory_allocate(int fd
, int context_id
, int type
, int size
, int align
,
163 unsigned long *handle
, unsigned int *gpu_addr
, void **map
);
165 int display_buffer_set(int fd
, int context_id
, int buffer_id
, int width
, int height
,
166 int pitch
, unsigned long offset
);
168 int set_flip_mode(int fd
, int context_id
, int head
, int mode
);
170 int reset_flip_status(int fd
, int context_id
, int head
);
172 int flip(int fd
, int context_id
, int head
, unsigned long offset
);
174 uint32_t get_tiled_pitch_size(uint32_t pitch
);
177 * How to convert image to JPG format:
179 * convert -depth 8 -size 1920x1080 rgba:image.argb \
180 * -channel All -separate -clone 0 -delete 0 -combine -channel BA \
181 * -negate +channel -background white -flatten image.jpg
183 * convert image.jpg -resize 640x480 image_small.jpg
185 int save_image(const char *filename
, const char *buf
, int len
);
187 void dump_fifo(FILE *fp
, const uint32_t *fifo
, unsigned int word_count
);
189 int set_reference(uint32_t *fifo
, uint32_t val
);
191 int transfer_data(uint32_t *fifo
, uint32_t src
, uint32_t dst
,
192 uint32_t dst_offset
, int32_t dst_pitch
,
193 uint32_t src_offset
, int32_t src_pitch
,
194 uint32_t row_length
, uint32_t row_count
);
196 int transfer_inline(uint32_t *fifo
, uint32_t dst
, uint32_t dst_offset
,
197 const uint32_t *data
, uint32_t word_count
);
199 int flip_display_buffer(uint32_t *fifo
, uint8_t channel_id
, uint8_t buffer_id
,
202 int set_depth_mask(uint32_t *fifo
, uint32_t mask
);
204 int set_color_mask(uint32_t *fifo
, uint32_t mask
);
206 int set_color_mask_mrt(uint32_t *fifo
, uint32_t mask
);
208 int set_clear_color(uint32_t *fifo
, uint32_t color
);
210 int set_scissor(uint32_t *fifo
, uint16_t x
, uint16_t y
, uint16_t w
, uint16_t h
);
212 int set_front_poly_mode(uint32_t *fifo
, uint32_t mode
);
214 int set_shade_mode(uint32_t *fifo
, uint32_t mode
);
216 int blend_enable(uint32_t *fifo
, uint32_t enable
);
218 int clear_surface(uint32_t *fifo
, uint32_t mask
);
220 int set_surface(uint32_t *fifo
, const struct surface_desc
*sd
);
222 int wait_label(uint32_t *fifo
, uint32_t index
, uint32_t val
);
224 int write_label(uint32_t *fifo
, uint32_t index
, uint32_t val
);
226 int write_backend_label(uint32_t *fifo
, uint32_t index
, uint32_t val
);
228 int write_texture_label(uint32_t *fifo
, uint32_t index
, uint32_t val
);
230 int set_viewport(uint32_t *fifo
, uint16_t x
, uint16_t y
, uint16_t w
, uint16_t h
,
231 float zmin
, float zmax
, const float offset
[4], const float scale
[4]);
233 int load_vertex_prg(uint32_t *fifo
, uint16_t slot
, const uint32_t *prg
, int instr_count
);
235 int set_vertex_prg_reg_count(uint32_t *fifo
, unsigned int count
);
237 int set_vertex_prg_start_slot(uint32_t *fifo
, uint16_t slot
);
239 int set_vertex_prg_const(uint32_t *fifo
, uint32_t start
, uint32_t count
,
243 * 0 ATTR0, POSITION Vertex (float4)
244 * 1 ATTR1, BLENDWEIGHT Vertex weight (float)
245 * 2 ATTR2, NORMAL Normal (float3)
246 * 3 ATTR3, COLOR, COLOR0, DIFFUSE Color (float4)
247 * 4 ATTR4, COLOR1, SPECULAR Secondary color (float4)
248 * 5 ATTR5, FOGCOORD, TESSFACTOR Fog coordinate (float)
249 * 6 ATTR6, PSIZE Point size (float)
250 * 7 ATTR7, BLENDINDICES Palette index for skinning (float4)
251 * 8 ATTR8, TEXCOORD0 Texture coordinate 0 (float4)
252 * 9 ATTR9, TEXCOORD1 Texture coordinate 1 (float4)
253 * 10 ATTR10, TEXCOORD2 Texture coordinate 2 (float4)
254 * 11 ATTR11, TEXCOORD3 Texture coordinate 3 (float4)
255 * 12 ATTR12, TEXCOORD4 Texture coordinate 4 (float4)
256 * 13 ATTR13, TEXCOORD5 Texture coordinate 5 (float4)
257 * 14 ATTR14, TEXCOORD6, TANGENT Texture coordinate 6 (float4) Tangent vector (float4)
258 * 15 ATTR15, TEXCOORD7, BINORMAL Texture coordinate 7 (float4) Binormal vector (float4)
260 int set_vertex_attr_inmask(uint32_t *fifo
, uint32_t mask
);
263 * 0 COLOR, COLOR0, COL0 Front diffuse color
264 * 1 COLOR1, COL1 Front specular color
265 * 2 BCOL0 Back diffuse color
266 * 3 BCOL1 Back specular color
268 * 5 PSIZE, PSIZ Point size
269 * 6 CLP0 User clip plane 0
270 * 7 CLP1 User clip plane 1
271 * 8 CLP2 User clip plane 2
272 * 9 CLP3 User clip plane 3
273 * 10 CLP4 User clip plane 4
274 * 11 CLP5 User clip plane 5
275 * 12 TEXCOORD8, TEX8 Texture coordinate 8
276 * 13 TEXCOORD9, TEX9 Texture coordinate 9
277 * 14 TEXCOORD0, TEX0 Texture coordinate 0
278 * 15 TEXCOORD1, TEX1 Texture coordinate 1
279 * 16 TEXCOORD2, TEX2 Texture coordinate 2
280 * 17 TEXCOORD3, TEX3 Texture coordinate 3
281 * 18 TEXCOORD4, TEX4 Texture coordinate 4
282 * 19 TEXCOORD5, TEX5 Texture coordinate 5
283 * 20 TEXCOORD6, TEX6 Texture coordinate 6
284 * 21 TEXCOORD7, TEX7 Texture coordinate 7
286 int set_vertex_attr_outmask(uint32_t *fifo
, uint32_t mask
);
288 int set_frag_prg(uint32_t *fifo
, uint8_t location
, uint32_t offset
);
290 int frag_prg_ctrl(uint32_t *fifo
, uint8_t reg_count
, uint8_t replace_txp_with_tex
,
291 uint8_t pixel_kill
, uint8_t output_from_h0
, uint8_t depth_replace
);
293 int draw_begin(uint32_t *fifo
, uint32_t mode
);
295 int draw_end(uint32_t *fifo
);
297 int set_vertex_data_arrfmt(uint32_t *fifo
, uint8_t reg
, uint16_t freq
,
298 uint8_t stride
, uint8_t size
, uint8_t type
);
300 int set_vertex_data_2f(uint32_t *fifo
, uint8_t reg
, const float val
[2]);
302 int set_vertex_data_4f(uint32_t *fifo
, uint8_t reg
, const float val
[4]);
304 int set_vertex_data_arr(uint32_t *fifo
, uint8_t reg
,
305 uint16_t freq
, uint8_t stride
, uint8_t size
, uint8_t type
,
306 uint8_t location
, uint32_t offset
);
308 int draw_arrays(uint32_t *fifo
, uint32_t mode
, uint32_t first
, uint32_t count
);
310 int invalidate_vertex_cache(uint32_t *fifo
);
312 int set_texture(uint32_t *fifo
, uint8_t index
, const struct texture_desc
*td
);
314 int texture_ctrl(uint32_t *fifo
, uint8_t index
, uint8_t enable
,
315 uint16_t min_lod
, uint16_t max_lod
, uint8_t max_aniso
);
317 int set_texture_addr(uint32_t *fifo
, uint8_t index
,
318 uint8_t wrap_s
, uint8_t wrap_t
, uint8_t wrap_r
, uint8_t unsigned_remap
,
319 uint8_t zfunc
, uint8_t gamma
);
321 int set_texture_filter(uint32_t *fifo
, uint8_t index
,
322 uint16_t bias
, uint8_t min
, uint8_t mag
, uint8_t conv
);
324 int invalidate_texture_cache(uint32_t *fifo
, uint32_t val
);
326 int set_timestamp(uint32_t *fifo
, uint32_t index
);