1*61046927SAndroid Build Coastguard Worker CROSS-PLATFORM PORTABILITY GUIDELINES FOR GALLIUM3D 2*61046927SAndroid Build Coastguard Worker 3*61046927SAndroid Build Coastguard Worker 4*61046927SAndroid Build Coastguard Worker= General Considerations = 5*61046927SAndroid Build Coastguard Worker 6*61046927SAndroid Build Coastguard WorkerThe frontend and winsys driver support a rather limited number of 7*61046927SAndroid Build Coastguard Workerplatforms. However, the pipe drivers are meant to run in a wide number of 8*61046927SAndroid Build Coastguard Workerplatforms. Hence the pipe drivers, the auxiliary modules, and all public 9*61046927SAndroid Build Coastguard Workerheaders in general, should strictly follow these guidelines to ensure 10*61046927SAndroid Build Coastguard Worker 11*61046927SAndroid Build Coastguard Worker 12*61046927SAndroid Build Coastguard Worker= Compiler Support = 13*61046927SAndroid Build Coastguard Worker 14*61046927SAndroid Build Coastguard Worker* Include the util/compiler.h. 15*61046927SAndroid Build Coastguard Worker 16*61046927SAndroid Build Coastguard Worker* Cast explicitly when converting to integer types of smaller sizes. 17*61046927SAndroid Build Coastguard Worker 18*61046927SAndroid Build Coastguard Worker* Cast explicitly when converting between float, double and integral types. 19*61046927SAndroid Build Coastguard Worker 20*61046927SAndroid Build Coastguard Worker* Don't use named struct initializers. 21*61046927SAndroid Build Coastguard Worker 22*61046927SAndroid Build Coastguard Worker* Don't use variable number of macro arguments. Use static inline functions 23*61046927SAndroid Build Coastguard Workerinstead. 24*61046927SAndroid Build Coastguard Worker 25*61046927SAndroid Build Coastguard Worker* Don't use C99 features. 26*61046927SAndroid Build Coastguard Worker 27*61046927SAndroid Build Coastguard Worker= Standard Library = 28*61046927SAndroid Build Coastguard Worker 29*61046927SAndroid Build Coastguard Worker* Avoid including standard library headers. Most standard library functions are 30*61046927SAndroid Build Coastguard Workernot available in Windows Kernel Mode. Use the appropriate p_*.h include. 31*61046927SAndroid Build Coastguard Worker 32*61046927SAndroid Build Coastguard Worker== Memory Allocation == 33*61046927SAndroid Build Coastguard Worker 34*61046927SAndroid Build Coastguard Worker* Use MALLOC, CALLOC, FREE instead of the malloc, calloc, free functions. 35*61046927SAndroid Build Coastguard Worker 36*61046927SAndroid Build Coastguard Worker* Use align_pointer() function defined in u_memory.h for aligning pointers 37*61046927SAndroid Build Coastguard Worker in a portable way. 38*61046927SAndroid Build Coastguard Worker 39*61046927SAndroid Build Coastguard Worker== Debugging == 40*61046927SAndroid Build Coastguard Worker 41*61046927SAndroid Build Coastguard Worker* Use the functions/macros in p_debug.h. 42*61046927SAndroid Build Coastguard Worker 43*61046927SAndroid Build Coastguard Worker* Don't include assert.h, call abort, printf, etc. 44*61046927SAndroid Build Coastguard Worker 45*61046927SAndroid Build Coastguard Worker 46*61046927SAndroid Build Coastguard Worker= Code Style = 47*61046927SAndroid Build Coastguard Worker 48*61046927SAndroid Build Coastguard Worker== Inherantice in C == 49*61046927SAndroid Build Coastguard Worker 50*61046927SAndroid Build Coastguard WorkerThe main thing we do is mimic inheritance by structure containment. 51*61046927SAndroid Build Coastguard Worker 52*61046927SAndroid Build Coastguard WorkerHere's a silly made-up example: 53*61046927SAndroid Build Coastguard Worker 54*61046927SAndroid Build Coastguard Worker/* base class */ 55*61046927SAndroid Build Coastguard Workerstruct buffer 56*61046927SAndroid Build Coastguard Worker{ 57*61046927SAndroid Build Coastguard Worker int size; 58*61046927SAndroid Build Coastguard Worker void (*validate)(struct buffer *buf); 59*61046927SAndroid Build Coastguard Worker}; 60*61046927SAndroid Build Coastguard Worker 61*61046927SAndroid Build Coastguard Worker/* sub-class of bufffer */ 62*61046927SAndroid Build Coastguard Workerstruct texture_buffer 63*61046927SAndroid Build Coastguard Worker{ 64*61046927SAndroid Build Coastguard Worker struct buffer base; /* the base class, MUST COME FIRST! */ 65*61046927SAndroid Build Coastguard Worker int format; 66*61046927SAndroid Build Coastguard Worker int width, height; 67*61046927SAndroid Build Coastguard Worker}; 68*61046927SAndroid Build Coastguard Worker 69*61046927SAndroid Build Coastguard Worker 70*61046927SAndroid Build Coastguard WorkerThen, we'll typically have cast-wrapper functions to convert base-class 71*61046927SAndroid Build Coastguard Workerpointers to sub-class pointers where needed: 72*61046927SAndroid Build Coastguard Worker 73*61046927SAndroid Build Coastguard Workerstatic inline struct vertex_buffer *vertex_buffer(struct buffer *buf) 74*61046927SAndroid Build Coastguard Worker{ 75*61046927SAndroid Build Coastguard Worker return (struct vertex_buffer *) buf; 76*61046927SAndroid Build Coastguard Worker} 77*61046927SAndroid Build Coastguard Worker 78*61046927SAndroid Build Coastguard Worker 79*61046927SAndroid Build Coastguard WorkerTo create/init a sub-classed object: 80*61046927SAndroid Build Coastguard Worker 81*61046927SAndroid Build Coastguard Workerstruct buffer *create_texture_buffer(int w, int h, int format) 82*61046927SAndroid Build Coastguard Worker{ 83*61046927SAndroid Build Coastguard Worker struct texture_buffer *t = malloc(sizeof(*t)); 84*61046927SAndroid Build Coastguard Worker t->format = format; 85*61046927SAndroid Build Coastguard Worker t->width = w; 86*61046927SAndroid Build Coastguard Worker t->height = h; 87*61046927SAndroid Build Coastguard Worker t->base.size = w * h; 88*61046927SAndroid Build Coastguard Worker t->base.validate = tex_validate; 89*61046927SAndroid Build Coastguard Worker return &t->base; 90*61046927SAndroid Build Coastguard Worker} 91*61046927SAndroid Build Coastguard Worker 92*61046927SAndroid Build Coastguard WorkerExample sub-class method: 93*61046927SAndroid Build Coastguard Worker 94*61046927SAndroid Build Coastguard Workervoid tex_validate(struct buffer *buf) 95*61046927SAndroid Build Coastguard Worker{ 96*61046927SAndroid Build Coastguard Worker struct texture_buffer *tb = texture_buffer(buf); 97*61046927SAndroid Build Coastguard Worker assert(tb->format); 98*61046927SAndroid Build Coastguard Worker assert(tb->width); 99*61046927SAndroid Build Coastguard Worker assert(tb->height); 100*61046927SAndroid Build Coastguard Worker} 101*61046927SAndroid Build Coastguard Worker 102*61046927SAndroid Build Coastguard Worker 103*61046927SAndroid Build Coastguard WorkerNote that we typically do not use typedefs to make "class names"; we use 104*61046927SAndroid Build Coastguard Worker'struct whatever' everywhere. 105*61046927SAndroid Build Coastguard Worker 106*61046927SAndroid Build Coastguard WorkerGallium's pipe_context and the subclassed psb_context, etc are prime examples 107*61046927SAndroid Build Coastguard Workerof this. There's also many examples in Mesa and the Mesa state tracker. 108