Subversion Repositories Kolibri OS

Rev

Rev 815 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
808 serge 1
 
2
3
 
4
#include "ati2d.h"
5
#include "accel_2d.h"
6
7
 
8
9
 
815 serge 10
11
 
808 serge 12
13
 
815 serge 14
 
808 serge 15
void STDCALL (*SetHwCursor)(cursor_t*,int x,int y)__asm__("SetHwCursor");
16
void STDCALL (*HwCursorRestore)(int x, int y)__asm("HwCursorRestore");
17
cursor_t* IMPORT (*HwCursorCreate)(void)__asm("HwCursorCreate"); //params eax, ebx, ecx
18
19
 
20
void (__stdcall *old_set)(cursor_t*,int x,int y);
21
void (__stdcall *old_restore)(int x, int y);
22
cursor_t* (*old_create)(void);
23
cursor_t* __create_cursor(void);
24
25
 
811 serge 26
808 serge 27
 
28
{
29
  RHDPtr rhdPtr;
30
  u32 retval;
31
32
 
33
34
 
35
    return 0;
36
37
 
38
  {
39
     printf("Can't open /rd/1/drivers/ati2d.log\nExit\n");
40
     return 0;
41
  }
42
43
 
44
  {
45
    dbgprintf("Device not found\n");
46
    return 0;
47
  };
48
49
 
50
  {
51
    if(rhd.memBase[i])
52
      dbgprintf("Memory base_%d 0x%x size 0x%x\n",
53
                i,rhd.memBase[i],(1<
54
  };
55
  for(i=0;i<6;i++)
56
  {
57
    if(rhd.ioBase[i])
58
      dbgprintf("Io base_%d 0x%x size 0x%x\n",
59
                i,rhd.ioBase[i],(1<
60
  };
61
  if(!RHDPreInit())
62
    return 0;
63
64
 
65
//  old_set = SetHwCursor;
66
//  old_restore = HwCursorRestore ;
67
//  old_create = HwCursorCreate;
68
69
 
70
  rhd.has_tcl = 1;
813 serge 71
  Init3DEngine(&rhd);
72
808 serge 73
 
74
75
 
76
 // SetHwCursor     = r500_SetCursor;
77
 // HwCursorCreate  = __create_cursor;
78
 // HwCursorRestore = r500_CursorRestore;
79
80
 
81
  dbgprintf("reg service %s as: %x\n", "HDRAW", retval);
82
83
 
84
  return retval;
85
};
86
87
 
88
 
89
90
 
91
92
 
93
94
 
95
96
 
97
{
98
  u32 *inp;
99
  u32 *outp;
100
101
 
102
  outp = io->output;
103
104
 
105
  {
106
    case SRV_GETVERSION:
107
      if(io->out_size==4)
108
      {
109
        *(u32*)io->output = API_VERSION;
110
        return 0;
111
      }
112
      break;
113
114
 
115
      return ERR_PARAM;
116
  };
117
  return ERR_PARAM;
118
}
119
120
 
121
 
122
{
123
  u32 *inp;
124
  u32 *outp;
125
126
 
127
  outp = io->output;
128
129
 
130
  {
131
    case SRV_GETVERSION:
132
      if(io->out_size==4)
133
      {
134
        *outp = API_VERSION;
135
        return 0;
136
      }
137
      break;
138
139
 
140
        if(io->inp_size==6)
817 serge 141
          return DrawRect((draw_t*)inp);
808 serge 142
        break;
143
144
 
810 serge 145
        if(io->inp_size==9)
817 serge 146
          return FillRect((fill_t*)inp);
810 serge 147
        break;
148
149
 
808 serge 150
        if(io->inp_size==5)
151
          return Line2P((line2p_t*)inp);
152
        break;
153
154
 
810 serge 155
        if(io->inp_size==6)
156
          return Blit((blit_t*)inp);
157
        break;
808 serge 158
159
 
813 serge 160
        if(io->inp_size==6)
161
          return RadeonComposite((blit_t*)inp);
162
        break;
163
164
 
815 serge 165
        if(io->inp_size==6)
817 serge 166
          return CreatePixmap((userpixmap_t*)inp);
167
        break;
815 serge 168
813 serge 169
 
815 serge 170
        if(io->inp_size==8)
171
          return PixBlit((pixblit_t*)inp);
172
        break;
173
174
 
817 serge 175
        if(io->inp_size==6)
176
          return LockPixmap((userpixmap_t*)inp);
177
        break;
178
179
 
808 serge 180
      return ERR_PARAM;
181
  };
182
  return ERR_PARAM;
183
}
184
185
 
186
 
187
#include "pci.c"
188
#include "ati_mem.c"
189
//#include "cursor.inc"
817 serge 190
808 serge 191
 
192
#include "accel_2d.inc"
193
#include "accel_3d.inc"
811 serge 194
808 serge 195
 
196
#define CLIP_BOTTOM     2
197
#define CLIP_RIGHT      4
198
#define CLIP_LEFT       8
199
200
 
201
 
202
/*=================================
203
204
 
205
{
206
    char            flag;
207
208
 
209
    if( x < clip.xmin ) {
210
        flag |= CLIP_LEFT;
211
    } else if( x > clip.xmax ) {
212
        flag |= CLIP_RIGHT;
213
    }
214
    if( y < clip.ymin ) {
215
        flag |= CLIP_TOP;
216
    } else if( y > clip.ymax ) {
217
        flag |= CLIP_BOTTOM;
218
    }
219
    return( flag );
220
}
221
222
 
223
 
224
/*===========================================================================
225
226
 
227
    (x1, y1) is outside and ( x2, y2 ) is inside the viewport.
228
    NOTE : the signs of denom and ( x - *x1 ) cancel out during division
229
           so make both of them positive before rounding.   */
230
{
231
    int            numer;
232
    int            denom;
233
234
 
235
    numer = 2L * (long)( y2 - *y1 ) * abs( x - *x1 );
236
    if( numer > 0 ) {
237
        numer += denom;                     /* round to closest pixel   */
238
    } else {
239
        numer -= denom;
240
    }
241
    *y1 += numer / ( denom << 1 );
242
    *x1 = x;
243
}
244
245
 
246
 
247
/*=============================================================
248
249
 
250
    viewport using the Cohen-Sutherland clipping algorithm. Return the
251
    clipped coordinates and a decision drawing flag.    */
252
{
253
    char            flag1;
254
    char            flag2;
255
256
 
257
    flag2 = _L1OutCode( *x2, *y2 );
258
    for( ;; ) {
259
        if( flag1 & flag2 ) break;                  /* trivially outside    */
260
        if( flag1 == flag2 ) break;                 /* completely inside    */
261
        if( flag1 == 0 ) {                          /* first point inside   */
262
            if( flag2 & CLIP_TOP ) {
263
                line_inter( y2, x2, *y1, *x1, clip.ymin );
264
            } else if( flag2 & CLIP_BOTTOM ) {
265
                line_inter( y2, x2, *y1, *x1, clip.ymax );
266
            } else if( flag2 & CLIP_RIGHT ) {
267
                line_inter( x2, y2, *x1, *y1, clip.xmax );
268
            } else if( flag2 & CLIP_LEFT ) {
269
                line_inter( x2, y2, *x1, *y1, clip.xmin );
270
            }
271
            flag2 = _L1OutCode( *x2, *y2 );
272
        } else {                                    /* second point inside  */
273
            if( flag1 & CLIP_TOP ) {
274
                line_inter( y1, x1, *y2, *x2, clip.ymin );
275
            } else if( flag1 & CLIP_BOTTOM ) {
276
                line_inter( y1, x1, *y2, *x2, clip.ymax );
277
            } else if( flag1 & CLIP_RIGHT ) {
278
                line_inter( x1, y1, *x2, *y2, clip.xmax );
279
            } else if( flag1 & CLIP_LEFT ) {
280
                line_inter( x1, y1, *x2, *y2, clip.xmin );
281
            }
282
            flag1 = _L1OutCode( *x1, *y1 );
283
        }
284
    }
285
    return( flag1 & flag2 );
286
}
287
288
 
289
 
290
/*======================================================
291
292
 
293
{
294
    if( flag & CLIP_TOP ) {
295
        *y = clip.ymin;
296
    } else if( flag & CLIP_BOTTOM ) {
297
        *y = clip.ymax;
298
    } else if( flag & CLIP_RIGHT ) {
299
        *x = clip.xmax;
300
    } else if( flag & CLIP_LEFT ) {
301
        *x = clip.xmin;
302
    }
303
}
304
305
 
306
 
307
/*==============================================================
308
309
 
310
    active viewport based on the Cohen-Sutherland algorithm for line
311
    clipping. Return the clipped coordinates and a decision drawing
312
    flag ( 0 draw : 1 don't draw ). */
313
{
314
    char            flag1;
315
    char            flag2;
316
317
 
318
    flag2 = _L1OutCode( *x2, *y2 );
319
    for( ;; ) {
320
        if( flag1 & flag2 ) break;                  /* trivially outside    */
321
        if( flag1 == flag2 ) break;                 /* completely inside    */
322
        if( flag1 == 0 ) {
323
            block_inter( x2, y2, flag2 );
324
            flag2 = _L1OutCode( *x2, *y2 );
325
        } else {
326
            block_inter( x1, y1, flag1 );
327
            flag1 = _L1OutCode( *x1, *y1 );
328
        }
329
    }
330
    return( flag1 & flag2 );
331
}
332
333
 
334
typedef struct
335
{
336
   int left;
337
   int top;
338
   int right;
339
   int bottom;
340
}rect_t;
341
342
 
343
{
344
   struct _window *fd;
345
   struct _window *bk;
346
347
 
348
   int width;
349
   int height;
350
351
 
352
}win_t, *WINPTR;
353
354
 
355
 
356
WINPTR bottom = NULL;
357
358
 
359
{
360
    WINPTR pwin = malloc(sizeof(win_t));
361
362
 
363
};
364
365
 
366
 
367
{
368
   WINPTR pwin = alloc_window();
369
370
 
371
   pwin->pos.top    = t;
372
   pwin->pos.right  = l+w-1;
373
   pwin->pos.bottom = t+h-1;
374
   pwin->width      = w;
375
   pwin->height     = h;
376
377
 
378
379
 
380
};
381
382
 
383
{
384
   WINPTR p = top;
385
386
 
387
   {
388
     if(pwin->level <= p->level)
389
     {
390
        pwin->fd = p;
391
        pwin->bk = p->bk;
392
        pwin->bk->fd = pwin;
393
        p->bk = pwin;
394
     }
395
     else
396
       p = p->fd;
397
   }
398
   else
399
     top = pwin;
400
}
401
402
 
403
>