1 typedef int GLint;
2 typedef unsigned char GLubyte;
3 typedef unsigned int uint32_t;
4 struct radeon_bo {
5     void *ptr;
6     uint32_t flags;
7 };
8 struct radeon_renderbuffer {
9     struct radeon_bo *bo;
10     unsigned int cpp;
11     int has_surface;
12 };
13 static inline
r600_1d_tile_helper(const struct radeon_renderbuffer * rrb,GLint x,GLint y,GLint is_depth,GLint is_stencil)14 GLint r600_1d_tile_helper(const struct radeon_renderbuffer * rrb,
15 			  GLint x, GLint y, GLint is_depth, GLint is_stencil)
16 {
17   GLint element_bytes = rrb->cpp;
18   GLint num_samples = 1;
19   GLint tile_width = 8;
20   GLint tile_height = 8;
21   GLint tile_thickness = 1;
22   GLint tile_bytes;
23   GLint tiles_per_row;
24   GLint slice_offset;
25   GLint tile_row_index;
26   GLint tile_column_index;
27   GLint tile_offset;
28   GLint pixel_number = 0;
29   GLint element_offset;
30   GLint offset = 0;
31   tile_bytes = tile_width * tile_height * tile_thickness
32       * element_bytes * num_samples;
33   tile_column_index = x / tile_width;
34   tile_offset = ((tile_row_index * tiles_per_row)
35 		 + tile_column_index) * tile_bytes;
36   if (is_depth) {
37   }
38   else {
39       GLint sample_offset;
40       switch (element_bytes) {
41 	  case 1:       pixel_number |= ((x >> 0) & 1) << 0;
42       }
43       element_offset = sample_offset + (pixel_number * element_bytes);
44   }
45   offset = slice_offset + tile_offset + element_offset;
46   return offset;
47 }
r600_ptr_color(const struct radeon_renderbuffer * rrb,GLint x,GLint y)48 GLubyte *r600_ptr_color(const struct radeon_renderbuffer * rrb,
49 			GLint x, GLint y)
50 {
51   GLubyte *ptr = rrb->bo->ptr;
52   uint32_t mask = 1 | 2;
53   GLint offset;
54   if (rrb->has_surface || !(rrb->bo->flags & mask)) {
55       offset = r600_1d_tile_helper(rrb, x, y, 0, 0);
56   }
57   return &ptr[offset];
58 }
59