Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
729 serge 1
if 0
2
 
3
 Copyright 2008  Serge
4
 
5
 The below code is a rework from code in
6
 xf86-video-radeonhd/src/r5xx_accel.c, xf86-video-radeonhd/src/r5xx_xaa.c
7
 
8
 Copyright 2008  Luc Verhaegen 
9
 Copyright 2008  Matthias Hopf 
10
 Copyright 2008  Egbert Eich   
11
 Copyright 2008  Advanced Micro Devices, Inc.
12
 
13
 Permission is hereby granted, free of charge, to any person obtaining a
14
 copy of this software and associated documentation files (the "Software"),
15
 to deal in the Software without restriction, including without limitation
16
 the rights to use, copy, modify, merge, publish, distribute, sublicense,
17
 and/or sell copies of the Software, and to permit persons to whom the
18
 Software is furnished to do so, subject to the following conditions:
19
 
20
 The above copyright notice and this permission notice shall be included in
21
 all copies or substantial portions of the Software.
22
 
23
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
24
 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
25
 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
26
 THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
27
 OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
28
 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
29
 OTHER DEALINGS IN THE SOFTWARE.
30
 
31
 The below code is a rework from code in xf86-video-ati/src/radeon_accel.c
32
 The original license is included below, it has the messed up disclaimer and
33
 an all rights reserved statement.
34
 
35
 
36
 Copyright 2000 ATI Technologies Inc., Markham, Ontario, and
37
                VA Linux Systems Inc., Fremont, California.
38
 
39
 All Rights Reserved.
40
 
41
 Permission is hereby granted, free of charge, to any person obtaining
42
 a copy of this software and associated documentation files (the
43
 "Software"), to deal in the Software without restriction, including
44
 without limitation on the rights to use, copy, modify, merge,
45
 publish, distribute, sublicense, and/or sell copies of the Software,
46
 and to permit persons to whom the Software is furnished to do so,
47
 subject to the following conditions:
48
 
49
 The above copyright notice and this permission notice (including the
50
 next paragraph) shall be included in all copies or substantial
51
 portions of the Software.
52
 
53
 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
54
 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
55
 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
56
 NON-INFRINGEMENT.  IN NO EVENT SHALL ATI, VA LINUX SYSTEMS AND/OR
57
 THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
58
 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
59
 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
60
 DEALINGS IN THE SOFTWARE.
61
 
62
 Authors:
63
   Kevin E. Martin 
64
   Rickard E. Faith 
65
   Alan Hourihane 
66
 
67
end if
68
 
732 serge 69
D1GRPH_PITCH                     equ 0x6120
734 serge 70
D1GRPH_X_END                     equ 0x6134
71
D1GRPH_Y_END                     equ 0x6138
729 serge 72
 
734 serge 73
 
729 serge 74
R5XX_DATATYPE_ARGB8888           equ  6
75
 
76
R5XX_RB3D_CNTL                   equ  0x1c3c
77
 
78
R5XX_RBBM_STATUS                 equ  0x0e40
79
  R5XX_RBBM_FIFOCNT_MASK         equ  0x007f
80
  R5XX_RBBM_ACTIVE               equ  (1 shl 31)
81
 
82
R5XX_RBBM_SOFT_RESET             equ  0x00f0
83
  R5XX_SOFT_RESET_CP             equ  (1 shl 0)
84
  R5XX_SOFT_RESET_HI             equ  (1 shl 1)
85
  R5XX_SOFT_RESET_SE             equ  (1 shl 2)
86
  R5XX_SOFT_RESET_RE             equ  (1 shl 3)
87
  R5XX_SOFT_RESET_PP             equ  (1 shl 4)
88
  R5XX_SOFT_RESET_E2             equ  (1 shl 5)
89
  R5XX_SOFT_RESET_RB             equ  (1 shl 6)
90
  R5XX_SOFT_RESET_HDP            equ  (1 shl 7)
91
 
92
R5XX_SRC_PITCH_OFFSET            equ  0x1428
93
R5XX_DST_PITCH_OFFSET            equ  0x142c
94
 
95
R5XX_DP_DATATYPE                 equ  0x16c4
96
  R5XX_HOST_BIG_ENDIAN_EN        equ  (1 shl 29)
97
 
98
R5XX_DP_CNTL                     equ  0x16c0
99
  R5XX_DST_X_LEFT_TO_RIGHT       equ (1 shl  0)
100
  R5XX_DST_Y_TOP_TO_BOTTOM       equ (1 shl  1)
101
  R5XX_DP_DST_TILE_LINEAR        equ (0 shl  3)
102
  R5XX_DP_DST_TILE_MACRO         equ (1 shl  3)
103
  R5XX_DP_DST_TILE_MICRO         equ (2 shl  3)
104
  R5XX_DP_DST_TILE_BOTH          equ (3 shl  3)
105
 
106
 
107
R5XX_RB3D_DSTCACHE_CTLSTAT       equ  0x325C
108
  R5XX_RB3D_DC_FLUSH             equ  (3 shl 0)
109
  R5XX_RB3D_DC_FREE              equ  (3 shl 2)
110
  R5XX_RB3D_DC_FLUSH_ALL         equ  0xf
111
  R5XX_RB3D_DC_BUSY              equ  (1 shl 31)
112
 
113
R5XX_SURFACE_CNTL                equ  0x0b00
114
  R5XX_SURF_TRANSLATION_DIS      equ  (1 shl 8)
115
  R5XX_NONSURF_AP0_SWP_16BPP     equ  (1 shl 20)
116
  R5XX_NONSURF_AP0_SWP_32BPP     equ  (1 shl 21)
117
  R5XX_NONSURF_AP1_SWP_16BPP     equ  (1 shl 22)
118
  R5XX_NONSURF_AP1_SWP_32BPP     equ  (1 shl 23)
119
 
120
R5XX_DEFAULT_SC_BOTTOM_RIGHT     equ  0x16e8
121
  R5XX_DEFAULT_SC_RIGHT_MAX      equ  (0x1fff shl  0)
122
  R5XX_DEFAULT_SC_BOTTOM_MAX     equ  (0x1fff shl 16)
123
 
124
R5XX_SC_TOP_LEFT                 equ  0x16ec
125
  R5XX_SC_BOTTOM_RIGHT           equ  0x16f0
126
  R5XX_SC_SIGN_MASK_LO           equ  0x8000
127
  R5XX_SC_SIGN_MASK_HI           equ  0x80000000
128
 
129
R5XX_DP_GUI_MASTER_CNTL          equ  0x146c
130
R5XX_GMC_SRC_PITCH_OFFSET_CNTL   equ  (1 shl 0)
131
R5XX_GMC_DST_PITCH_OFFSET_CNTL   equ  (1 shl 1)
132
R5XX_GMC_SRC_CLIPPING            equ  (1 shl 2)
133
R5XX_GMC_DST_CLIPPING            equ  (1    shl 3)
134
R5XX_GMC_BRUSH_DATATYPE_MASK     equ  (0x0f shl 4)
135
R5XX_GMC_BRUSH_8X8_MONO_FG_BG    equ  (0    shl 4)
136
R5XX_GMC_BRUSH_8X8_MONO_FG_LA    equ  (1    shl 4)
137
R5XX_GMC_BRUSH_1X8_MONO_FG_BG    equ  (4    shl 4)
138
R5XX_GMC_BRUSH_1X8_MONO_FG_LA    equ  (5    shl 4)
139
R5XX_GMC_BRUSH_32x1_MONO_FG_BG   equ  (6    shl 4)
140
R5XX_GMC_BRUSH_32x1_MONO_FG_LA   equ  (7    shl 4)
141
R5XX_GMC_BRUSH_32x32_MONO_FG_BG  equ  (8    shl 4)
142
R5XX_GMC_BRUSH_32x32_MONO_FG_LA  equ  (9    shl 4)
143
R5XX_GMC_BRUSH_8x8_COLOR         equ  (10   shl 4)
144
R5XX_GMC_BRUSH_1X8_COLOR         equ  (12   shl 4)
145
R5XX_GMC_BRUSH_SOLID_COLOR       equ  (13   shl 4)
146
R5XX_GMC_BRUSH_NONE              equ  (15   shl 4)
147
R5XX_GMC_DST_8BPP_CI             equ  (2    shl 8)
148
R5XX_GMC_DST_15BPP               equ  (3    shl 8)
149
R5XX_GMC_DST_16BPP               equ  (4    shl 8)
150
R5XX_GMC_DST_24BPP               equ  (5    shl 8)
151
R5XX_GMC_DST_32BPP               equ  (6    shl 8)
152
R5XX_GMC_DST_8BPP_RGB            equ  (7    shl 8)
153
R5XX_GMC_DST_Y8                  equ  (8    shl 8)
154
R5XX_GMC_DST_RGB8                equ  (9    shl 8)
155
R5XX_GMC_DST_VYUY                equ  (11   shl 8)
156
R5XX_GMC_DST_YVYU                equ  (12   shl 8)
157
R5XX_GMC_DST_AYUV444             equ  (14   shl 8)
158
R5XX_GMC_DST_ARGB4444            equ  (15   shl 8)
159
R5XX_GMC_DST_DATATYPE_MASK       equ  (0x0f shl 8)
160
R5XX_GMC_DST_DATATYPE_SHIFT      equ  8
161
R5XX_GMC_SRC_DATATYPE_MASK       equ  (3    shl 12)
162
R5XX_GMC_SRC_DATATYPE_MONO_FG_BG equ  (0    shl 12)
163
R5XX_GMC_SRC_DATATYPE_MONO_FG_LA equ  (1    shl 12)
164
R5XX_GMC_SRC_DATATYPE_COLOR      equ  (3    shl 12)
165
R5XX_GMC_BYTE_PIX_ORDER          equ  (1    shl 14)
166
R5XX_GMC_BYTE_MSB_TO_LSB         equ  (0    shl 14)
167
R5XX_GMC_BYTE_LSB_TO_MSB         equ  (1    shl 14)
168
R5XX_GMC_CONVERSION_TEMP         equ  (1    shl 15)
169
R5XX_GMC_CONVERSION_TEMP_6500    equ  (0    shl 15)
170
R5XX_GMC_CONVERSION_TEMP_9300    equ  (1    shl 15)
171
R5XX_GMC_ROP3_MASK               equ  (0xff shl 16)
172
R5XX_DP_SRC_SOURCE_MASK          equ  (7    shl 24)
173
R5XX_DP_SRC_SOURCE_MEMORY        equ  (2    shl 24)
174
R5XX_DP_SRC_SOURCE_HOST_DATA     equ  (3    shl 24)
175
R5XX_GMC_3D_FCN_EN               equ  (1    shl 27)
176
R5XX_GMC_CLR_CMP_CNTL_DIS        equ  (1    shl 28)
177
R5XX_GMC_AUX_CLIP_DIS            equ  (1    shl 29)
178
R5XX_GMC_WR_MSK_DIS              equ  (1    shl 30)
179
R5XX_GMC_LD_BRUSH_Y_X            equ  (1    shl 31)
180
R5XX_ROP3_ZERO                   equ  0x00000000
181
R5XX_ROP3_DSa                    equ  0x00880000
182
R5XX_ROP3_SDna                   equ  0x00440000
183
R5XX_ROP3_S                      equ  0x00cc0000
184
R5XX_ROP3_DSna                   equ  0x00220000
185
R5XX_ROP3_D                      equ  0x00aa0000
186
R5XX_ROP3_DSx                    equ  0x00660000
187
R5XX_ROP3_DSo                    equ  0x00ee0000
188
R5XX_ROP3_DSon                   equ  0x00110000
189
R5XX_ROP3_DSxn                   equ  0x00990000
190
R5XX_ROP3_Dn                     equ  0x00550000
191
R5XX_ROP3_SDno                   equ  0x00dd0000
192
R5XX_ROP3_Sn                     equ  0x00330000
193
R5XX_ROP3_DSno                   equ  0x00bb0000
194
R5XX_ROP3_DSan                   equ  0x00770000
195
R5XX_ROP3_ONE                    equ  0x00ff0000
196
R5XX_ROP3_DPa                    equ  0x00a00000
197
R5XX_ROP3_PDna                   equ  0x00500000
198
R5XX_ROP3_P                      equ  0x00f00000
199
R5XX_ROP3_DPna                   equ  0x000a0000
200
R5XX_ROP3_D                      equ  0x00aa0000
201
R5XX_ROP3_DPx                    equ  0x005a0000
202
R5XX_ROP3_DPo                    equ  0x00fa0000
203
R5XX_ROP3_DPon                   equ  0x00050000
204
R5XX_ROP3_PDxn                   equ  0x00a50000
205
R5XX_ROP3_PDno                   equ  0x00f50000
206
R5XX_ROP3_Pn                     equ  0x000f0000
207
R5XX_ROP3_DPno                   equ  0x00af0000
208
R5XX_ROP3_DPan                   equ  0x005f0000
209
 
210
R5XX_HOST_PATH_CNTL              equ  0x0130
211
R5XX_HDP_SOFT_RESET              equ  (1 shl 26)
212
R5XX_HDP_APER_CNTL               equ  (1 shl 23)
213
 
214
R5XX_RB3D_DSTCACHE_MODE             equ  0x3258
215
R5XX_RB3D_DC_CACHE_ENABLE           equ      (0)
216
R5XX_RB3D_DC_2D_CACHE_DISABLE       equ      (1)
217
R5XX_RB3D_DC_3D_CACHE_DISABLE       equ      (2)
218
R5XX_RB3D_DC_CACHE_DISABLE          equ      (3)
219
R5XX_RB3D_DC_2D_CACHE_LINESIZE_128  equ  (1 shl  2)
220
R5XX_RB3D_DC_3D_CACHE_LINESIZE_128  equ  (2 shl  2)
221
R5XX_RB3D_DC_2D_CACHE_AUTOFLUSH     equ  (1 shl  8)
222
R5XX_RB3D_DC_3D_CACHE_AUTOFLUSH     equ  (2 shl  8)
223
R200_RB3D_DC_2D_CACHE_AUTOFREE      equ  (1 shl 10)
224
R200_RB3D_DC_3D_CACHE_AUTOFREE      equ  (2 shl 10)
225
R5XX_RB3D_DC_FORCE_RMW              equ  (1 shl 16)
226
R5XX_RB3D_DC_DISABLE_RI_FILL        equ  (1 shl 24)
227
R5XX_RB3D_DC_DISABLE_RI_READ        equ  (1 shl 25)
228
 
229
R5XX_BRUSH_Y_X                      equ  0x1474
230
R5XX_DP_BRUSH_BKGD_CLR              equ  0x1478
231
R5XX_DP_BRUSH_FRGD_CLR              equ  0x147c
232
R5XX_BRUSH_DATA0                    equ  0x1480
233
R5XX_BRUSH_DATA1                    equ  0x1484
234
 
732 serge 235
R5XX_SRC_Y_X                        equ  0x1434
236
 
237
R5XX_DST_Y_X                        equ  0x1438
238
R5XX_DST_HEIGHT_WIDTH               equ  0x143c
729 serge 239
R5XX_DST_WIDTH_HEIGHT               equ  0x1598
240
 
732 serge 241
R5XX_DST_LINE_START                 equ  0x1600
242
R5XX_DST_LINE_END                   equ  0x1604
243
R5XX_DST_LINE_PATCOUNT              equ  0x1608
244
  R5XX_BRES_CNTL_SHIFT              equ  8
245
 
246
 
729 serge 247
R5XX_DP_SRC_BKGD_CLR                equ  0x15dc
248
R5XX_DP_SRC_FRGD_CLR                equ  0x15d8
249
 
250
R5XX_DP_WRITE_MASK                  equ  0x16cc
251
 
252
struc RHD
253
{
254
  .control           rd 1
255
  .control_saved     rd 1
256
  .datatype          rd 1
257
  .surface_cntl      rd 1
258
  .dst_pitch_offset  rd 1
259
};
260
 
261
R5XX_LOOP_COUNT equ 2000000
262
 
263
align 4
264
R5xxFIFOWaitLocal:
265
 
266
           mov ecx, R5XX_LOOP_COUNT
267
@@:
268
           rdr ebx, R5XX_RBBM_STATUS
269
           and ebx, R5XX_RBBM_FIFOCNT_MASK
270
 
271
           cmp eax, ebx
272
           jbe .done
273
           loop @B
274
 
275
           mov esi, msgR5xxFIFOWaitLocaltimeout
276
           call SysMsgBoardStr
277
           xor eax, eax
278
           ret
279
.done:
280
           mov eax, 1
281
           ret
282
 
283
align 4
284
R5xxFIFOWait:
285
           call R5xxFIFOWaitLocal
286
           test eax, eax
287
           jz .reset
288
 
289
           ret
290
.reset:
291
           call R5xx2DReset
292
           call R5xx2DSetup
293
 
294
           ret
295
 
296
 
297
; Wait for the graphics engine to be completely idle: the FIFO has
298
; drained, the Pixel Cache is flushed, and the engine is idle.  This is
299
; a standard "sync" function that will make the hardware "quiescent".
300
 
301
align 4
302
R5xx2DIdleLocal:
303
 
304
           mov ecx, R5XX_LOOP_COUNT
305
@@:
306
           rdr eax, R5XX_RBBM_STATUS
307
           and eax, R5XX_RBBM_FIFOCNT_MASK
308
           cmp eax, 0x40
309
           je @F
310
           loop @B
311
 
312
           mov esi, msgR5xx2DIdleLocaltimeout
313
           call SysMsgBoardStr
314
           xor eax, eax
315
           ret
316
@@:
317
           mov ecx, R5XX_LOOP_COUNT
318
@@:
319
           rdr eax, R5XX_RBBM_STATUS
320
           test eax, R5XX_RBBM_ACTIVE
321
           jz .done
322
           loop @B
323
 
324
           mov esi, msgR5xx2DIdleLocaltimeout
325
           call SysMsgBoardStr
326
           xor eax, eax
327
           ret
328
.done:
329
           call R5xx2DFlush
330
           ret
331
 
332
align 4
333
R5xx2DFlush:
334
           rmask R5XX_RB3D_DSTCACHE_CTLSTAT, R5XX_RB3D_DC_FLUSH_ALL, R5XX_RB3D_DC_FLUSH_ALL
335
 
336
           mov ecx, R5XX_LOOP_COUNT
337
@@:
338
           rdr eax, R5XX_RB3D_DSTCACHE_CTLSTAT
339
           test eax, R5XX_RB3D_DC_BUSY
340
           jz .done
341
           loop @B
342
.fail:
343
           mov esi, msgR5xx2DFlushtimeout
344
           call SysMsgBoardStr
345
           xor eax, eax
346
           ret
347
.done:
348
           mov eax, 1
349
           ret
350
 
351
align 4
352
proc R5xx2DReset
353
           locals
354
             save    rd 1
355
             tmp     rd 1
356
           endl
357
 
358
 ; The following RBBM_SOFT_RESET sequence can help un-wedge
359
 ; an R300 after the command processor got stuck.
360
 
361
           rdr eax, R5XX_RBBM_SOFT_RESET
362
           mov [save], eax
363
 
364
           or eax, R5XX_SOFT_RESET_CP or \
365
                   R5XX_SOFT_RESET_HI or R5XX_SOFT_RESET_SE or \
366
                   R5XX_SOFT_RESET_RE or R5XX_SOFT_RESET_PP or \
367
                   R5XX_SOFT_RESET_E2 or R5XX_SOFT_RESET_RB
368
           mov [tmp], eax
369
 
370
           wrr R5XX_RBBM_SOFT_RESET, eax
371
 
372
           rdr ebx, R5XX_RBBM_SOFT_RESET
373
           and eax, not (R5XX_SOFT_RESET_CP or R5XX_SOFT_RESET_HI or \
374
                         R5XX_SOFT_RESET_SE or R5XX_SOFT_RESET_RE or \
375
                         R5XX_SOFT_RESET_PP or R5XX_SOFT_RESET_E2 or \
376
                         R5XX_SOFT_RESET_RB)
377
           wrr R5XX_RBBM_SOFT_RESET, eax
378
           rdr ebx, R5XX_RBBM_SOFT_RESET
379
           mov eax, [save]
380
           wrr R5XX_RBBM_SOFT_RESET, eax
381
           rdr ebx, R5XX_RBBM_SOFT_RESET
382
           call R5xx2DFlush
383
 
384
; Soft resetting HDP thru RBBM_SOFT_RESET register can cause some
385
; unexpected behaviour on some machines.  Here we use
386
; R5XX_HOST_PATH_CNTL to reset it.
387
 
388
           rdr edx, R5XX_HOST_PATH_CNTL
389
 
390
           rdr ebx, R5XX_RBBM_SOFT_RESET
391
 
392
           or ebx, R5XX_SOFT_RESET_CP or R5XX_SOFT_RESET_HI or R5XX_SOFT_RESET_E2
393
 
394
           wrr R5XX_RBBM_SOFT_RESET, ebx
395
 
396
           rdr eax, R5XX_RBBM_SOFT_RESET
397
 
398
           wrr R5XX_RBBM_SOFT_RESET, 0
399
 
400
           rdr ebx, R5XX_RB3D_DSTCACHE_MODE
401
 
402
           or ebx, (1 shl 17)
403
           wrr R5XX_RB3D_DSTCACHE_MODE, ebx
404
 
405
           lea eax, [edx+R5XX_HDP_SOFT_RESET]
406
           wrr R5XX_HOST_PATH_CNTL, eax
407
 
408
           rdr ebx, R5XX_HOST_PATH_CNTL
409
 
410
           wrr R5XX_HOST_PATH_CNTL, edx
411
 
412
           ret
413
endp
414
 
415
align 4
416
R5xx2DSetup:
417
 
418
; Setup engine location. This shouldn't be necessary since we
419
; set them appropriately before any accel ops, but let's avoid
420
; random bogus DMA in case we inadvertently trigger the engine
421
; in the wrong place (happened).
422
 
423
           mov eax, 2
424
           call R5xxFIFOWaitLocal
425
 
426
           mov eax, [rhd.dst_pitch_offset]
427
           wrr R5XX_DST_PITCH_OFFSET, eax
428
 
429
           wrr R5XX_SRC_PITCH_OFFSET, eax
430
 
431
           mov eax, 1
432
           call R5xxFIFOWaitLocal
433
 
434
           rmask R5XX_DP_DATATYPE, 0, R5XX_HOST_BIG_ENDIAN_EN
435
 
436
           mov eax, [rhd.surface_cntl]
437
           wrr R5XX_SURFACE_CNTL, eax
438
 
439
           mov eax, 1
440
           call R5xxFIFOWaitLocal
441
 
442
           wrr R5XX_DEFAULT_SC_BOTTOM_RIGHT,\
443
               (R5XX_DEFAULT_SC_RIGHT_MAX or R5XX_DEFAULT_SC_BOTTOM_MAX)
444
 
445
           mov eax, 1
446
           call R5xxFIFOWaitLocal
447
 
448
           mov eax, [rhd.control]
449
           or eax, (R5XX_GMC_BRUSH_SOLID_COLOR or R5XX_GMC_SRC_DATATYPE_COLOR)
450
           wrr R5XX_DP_GUI_MASTER_CNTL, eax
451
 
452
           mov eax, 5
453
           call R5xxFIFOWaitLocal
454
 
455
           wrr R5XX_DP_BRUSH_FRGD_CLR, 0xFFFFFFFF
456
 
457
           wrr R5XX_DP_BRUSH_BKGD_CLR, 0x00000000
458
 
459
           wrr R5XX_DP_SRC_FRGD_CLR, 0xFFFFFFFF
460
           wrr R5XX_DP_SRC_BKGD_CLR, 0x00000000
461
           wrr R5XX_DP_WRITE_MASK, 0xFFFFFFFF
462
 
463
           call R5xx2DIdleLocal
464
           ret
465
 
466
align 4
467
R5xx2DPreInit:
468
 
734 serge 469
           mov [rhd.control],\
470
               (R5XX_DATATYPE_ARGB8888 shl R5XX_GMC_DST_DATATYPE_SHIFT) or\
471
                R5XX_GMC_CLR_CMP_CNTL_DIS or R5XX_GMC_DST_PITCH_OFFSET_CNTL
729 serge 472
 
473
           mov [rhd.datatype], R5XX_DATATYPE_ARGB8888
474
           mov [rhd.surface_cntl],0
475
 
732 serge 476
           rdr eax, D1GRPH_PITCH
477
           shl eax, 18
478
 
479
           mov ebx, [r500_LFB]
480
           shr ebx, 10
481
           or eax, ebx
482
 
729 serge 483
           mov [rhd.dst_pitch_offset], eax
484
 
485
           ret
486
 
487
align 4
488
R5xx2DInit:
489
 
490
           call R5xx2DPreInit
491
           wrr R5XX_RB3D_CNTL, 0
492
           call R5xx2DReset
493
           call R5xx2DSetup
734 serge 494
 
495
           rdr eax, D1GRPH_X_END
496
           rdr ebx, D1GRPH_Y_END
497
           dec eax
498
           dec ebx
499
 
500
           mov [__xmin], 0         ;set clip
501
           mov [__ymin], 0
502
           mov [__xmax], eax
503
           mov [__ymax], ebx
504
 
729 serge 505
           ret
506
 
507
proc R5xxSetupForSolidFill stdcall,color:dword, rop:dword, planemask:dword
508
 
509
           mov edx, [rop]
510
           mov edx, [R5xxRops+4+edx*8]
511
           or edx, [rhd.control]
512
           or edx, (R5XX_GMC_BRUSH_SOLID_COLOR or R5XX_GMC_SRC_DATATYPE_COLOR)
513
 
514
; Save for later clipping */
515
           mov [rhd.control_saved], edx
516
 
517
           mov eax, 4
518
           call R5xxFIFOWait
519
 
520
           wrr R5XX_DP_GUI_MASTER_CNTL, edx
521
 
522
           mov eax, [color]
523
           wrr R5XX_DP_BRUSH_FRGD_CLR, eax
524
 
525
           mov ebx, [planemask]
526
           wrr R5XX_DP_WRITE_MASK, ebx
527
 
528
           wrr R5XX_DP_CNTL, (R5XX_DST_X_LEFT_TO_RIGHT or R5XX_DST_Y_TOP_TO_BOTTOM)
529
 
530
           ret
531
 endp
532
 
533
align 4
534
proc R5xxSolidFillRect stdcall, x:dword, y:dword, w:dword, h:dword
535
 
536
           mov eax, 3
537
           call R5xxFIFOWait
538
 
539
           mov eax, [rhd.dst_pitch_offset]
540
           wrr R5XX_DST_PITCH_OFFSET, eax
541
 
542
           mov ebx, [y]
543
           shl ebx, 16
544
           mov bx, word [x]
545
           wrr R5XX_DST_Y_X, ebx
546
 
547
           mov ecx, [w]
548
           shl ecx, 16
549
           mov cx, word [h]
550
           wrr R5XX_DST_WIDTH_HEIGHT, ecx
551
 
552
           ret
553
endp
554
 
732 serge 555
handle     equ  IOCTL.handle
556
io_code    equ  IOCTL.io_code
557
input      equ  IOCTL.input
558
inp_size   equ  IOCTL.inp_size
559
output     equ  IOCTL.output
560
out_size   equ  IOCTL.out_size
729 serge 561
 
732 serge 562
SRV_GETVERSION  equ 0
563
SOLID_FILL      equ 1
564
LINE_2P         equ 2
565
 
566
align 4
567
proc r500_entry stdcall, state:dword
568
 
569
.close:
570
          ; call r500_close
571
 
572
           xor eax, eax
573
           ret
574
endp
575
 
736 serge 576
CURRENT_TASK	    equ (OS_BASE+0x0003000)
577
TASK_COUNT	    equ (OS_BASE+0x0003004)
578
WIN_STACK 	    equ (OS_BASE+0x000C000)
579
 
580
 
732 serge 581
align 4
582
proc r500_HDraw stdcall, ioctl:dword
583
 
584
           mov ebx, [ioctl]
585
           mov eax, [ebx+io_code]
586
           cmp eax, LINE_2P
587
           ja .fail
588
 
589
           cmp eax, SRV_GETVERSION
590
           jne @F
591
 
592
           mov eax, [ebx+output]
593
           cmp [ebx+out_size], 4
594
           jne .fail
595
           mov [eax], dword API_VERSION
596
           xor eax, eax
597
           ret
598
@@:
736 serge 599
           mov edx, [CURRENT_TASK]
600
           movzx edx, word [WIN_STACK+edx*2]
601
           cmp edx, [TASK_COUNT]
602
           jne .skip                                   ;skip if window inactive
603
 
732 serge 604
           cmp eax, SOLID_FILL
605
           jne @F
606
 
607
           cmp [ebx+inp_size], 5
608
           jne .fail
609
 
610
           mov esi, [ebx+input]
611
           call solid_fill
736 serge 612
.skip:
732 serge 613
           xor eax, eax
614
           ret
615
@@:
616
           cmp eax, LINE_2P
617
           jne @F
618
 
619
           cmp [ebx+inp_size], 5
620
           jne .fail
621
 
622
           mov esi, [ebx+input]
623
           call solid_line
624
           xor eax, eax
625
           ret
626
@@:
627
 
628
.fail:
629
           or eax, -1
630
           ret
631
endp
632
 
633
restore   handle
634
restore   io_code
635
restore   input
636
restore   inp_size
637
restore   output
638
restore   out_size
639
 
640
struc FILL
641
{
642
  .color  rd 1
643
  .x      rd 1
644
  .y      rd 1
645
  .w      rd 1
646
  .h      rd 1
647
}
648
 
649
virtual at 0
650
  FILL FILL
651
end virtual
652
 
653
struc LINE2P
654
{
655
  .color  rd 1
656
  .x1      rd 1
657
  .y1      rd 1
658
  .x2      rd 1
659
  .y2      rd 1
660
}
661
 
662
virtual at 0
663
  LINE2P LINE2P
664
end virtual
665
 
666
GXcopy  equ 3
667
 
668
; esi= input params
669
align 4
670
solid_fill:
671
 
734 serge 672
           mov ebx, [esi+FILL.x]
673
           mov ecx, [esi+FILL.y]
674
           mov eax, [esi+FILL.w]
675
           mov edx, [esi+FILL.h]
676
 
677
           lea eax, [eax+ebx-1]     ;x2
678
           lea edx, [edx+ecx-1]     ;y2
679
 
680
           push edx                 ;y2
681
           push eax                 ;x2
682
 
683
           mov eax, esp             ;&x2
684
           lea ebx, [esp+4]         ;&y2
685
 
686
           lea ecx, [esi+FILL.x]
687
           lea edx, [esi+FILL.y]
688
 
689
           push ebx                 ;&y2
690
           push eax                 ;&x2
691
           push edx                 ;&y1
692
           push ecx                 ;&x1
693
 
694
           call _BlockClip
695
           add esp, 16
696
           test eax, eax
697
           jnz .exit
698
 
732 serge 699
           mov edx, [R5xxRops+4+GXcopy*8]
700
           or edx, [rhd.control]
701
           or edx, (R5XX_GMC_BRUSH_SOLID_COLOR or R5XX_GMC_SRC_DATATYPE_COLOR)
702
 
736 serge 703
           pushfd
704
           cli
705
 
732 serge 706
           mov eax, 7
707
           call R5xxFIFOWait
708
 
709
           wrr R5XX_DP_GUI_MASTER_CNTL, edx
710
 
711
           mov eax, [esi+FILL.color]
712
           wrr R5XX_DP_BRUSH_FRGD_CLR, eax
713
 
714
           wrr R5XX_DP_WRITE_MASK, 0xFFFFFFFF
715
 
716
           wrr R5XX_DP_CNTL, (R5XX_DST_X_LEFT_TO_RIGHT or R5XX_DST_Y_TOP_TO_BOTTOM)
717
 
718
           mov eax, [rhd.dst_pitch_offset]
719
           wrr R5XX_DST_PITCH_OFFSET, eax
720
 
721
           mov ebx, [esi+FILL.y]
722
           shl ebx, 16
723
           mov bx, word [esi+FILL.x]
724
           wrr R5XX_DST_Y_X, ebx
725
 
736 serge 726
           mov ecx, [esp+4]             ;x2
734 serge 727
           sub ecx, [esi+FILL.x]
728
           inc ecx                      ;w
729
 
736 serge 730
           mov eax, [esp+8]             ;y2
734 serge 731
           sub eax, [esi+FILL.y]
732
           inc eax                      ;h
733
 
732 serge 734
           shl ecx, 16
734 serge 735
           mov cx, ax                        ;w|h
732 serge 736
           wrr R5XX_DST_WIDTH_HEIGHT, ecx
736 serge 737
           popfd
734 serge 738
.exit:
739
           add esp, 8
732 serge 740
           ret
741
 
742
align 4
743
solid_line:
744
 
734 serge 745
           lea eax, [esi+LINE2P.y2]
746
           lea ebx, [esi+LINE2P.x2]
747
           lea ecx, [esi+LINE2P.y1]
748
           lea edx, [esi+LINE2P.x1]
749
 
750
           push eax
751
           push ebx
752
           push ecx
753
           push edx
754
 
755
           call _LineClip
756
           add esp, 16
757
           test eax, eax
758
           jnz .exit
759
 
732 serge 760
           mov edx, [R5xxRops+4+GXcopy*8]
761
           or edx, [rhd.control]
762
           or edx, (R5XX_GMC_BRUSH_SOLID_COLOR or R5XX_GMC_SRC_DATATYPE_COLOR)
763
 
736 serge 764
           pushfd
765
           cli
766
 
767
           mov eax, 7
768
           call R5xxFIFOWait
769
 
732 serge 770
           wrr R5XX_DST_LINE_PATCOUNT, (0x55 shl R5XX_BRES_CNTL_SHIFT)
771
           wrr R5XX_DP_GUI_MASTER_CNTL, edx
772
 
773
           mov eax, [esi+FILL.color]
774
           wrr R5XX_DP_BRUSH_FRGD_CLR, eax
775
 
776
           wrr R5XX_DP_WRITE_MASK, 0xFFFFFFFF
777
 
778
           mov eax, [rhd.dst_pitch_offset]
779
           wrr R5XX_DST_PITCH_OFFSET, eax
780
 
781
           mov ebx, [esi+LINE2P.y1]
782
           shl ebx, 16
783
           mov bx, word [esi+LINE2P.x1]
784
           wrr R5XX_DST_LINE_START, ebx
785
 
786
           mov ecx, [esi+LINE2P.y2]
787
           shl ecx, 16
788
           mov cx, word [esi+LINE2P.x2]
789
           wrr R5XX_DST_LINE_END, ecx
736 serge 790
           popfd
734 serge 791
.exit:
792
           ret
732 serge 793
 
734 serge 794
align 4
795
__L1OutCode:
796
           cmp     eax, [__xmin]
797
           mov     ecx, edx
798
           setl    dl
799
           sal     edx, 3
800
           cmp     eax, [__xmax]
801
           jle     L9
802
           or      edx, 4
803
L9:
804
           cmp     ecx, [__ymin]
805
           jge     L11
806
           or      edx, 1
807
L11:
808
           cmp     ecx, [__ymax]
809
           jle     L13
810
           or      edx, 2
811
L13:
812
           movzx   eax, dl
732 serge 813
           ret
734 serge 814
 
815
align 4
816
_line_inter:
817
           push    ebp
818
           mov     ebp, edx
819
           push    edi
820
           push    esi
821
           push    ebx
822
           sub     esp, 4
823
           mov     ebx, [eax]
824
           mov     [esp], eax
825
           mov     edx, [esp+24]
826
           mov     edi, [ebp]
827
           sub     ecx, ebx
828
           mov     eax, ecx
829
           sar     eax, 31
830
           sub     edx, edi
831
           mov     esi, eax
832
           xor     esi, ecx
833
           sub     esi, eax
834
           mov     eax, [esp+28]
835
           lea     ecx, [edx+edx]
836
           sub     eax, ebx
837
           cdq
838
           xor     eax, edx
839
           sub     eax, edx
840
           imul    ecx, eax
841
           test    ecx, ecx
842
           jle     L17
843
           add     ecx, esi
844
           jmp     L19
845
L17:
846
           sub     ecx, esi
847
L19:
848
           lea     edx, [esi+esi]
849
           mov     eax, ecx
850
           mov     ebx, edx
851
           cdq
852
           idiv    ebx
853
           lea     eax, [eax+edi]
854
           mov     [ebp], eax
855
           mov     eax, [esp]
856
           mov     edx, [esp+28]
857
           mov     [eax], edx
858
           pop     eax
859
           pop     ebx
860
           pop     esi
861
           pop     edi
862
           pop     ebp
863
           ret
864
 
865
_LineClip:
866
           push    ebp
867
           push    edi
868
           push    esi
869
           push    ebx
870
           mov     eax, [esp+24]
871
           mov     ecx, [esp+20]
872
           mov     ebp, [esp+28]
873
           mov     edi, [esp+32]
874
           mov     edx, [eax]
875
           mov     eax, [ecx]
876
           call    __L1OutCode
877
           mov     edx, [edi]
878
           mov     bl, al
879
           mov     eax, [ebp]
880
           call    __L1OutCode
881
L48:
882
           mov     esi, eax
883
L47:
884
           mov     eax, esi
885
           and     al, bl
886
           jne     L23
887
           mov     edx, esi
888
           cmp     bl, dl
889
           je      L23
890
           test    bl, bl
891
           jne     L26
892
           movsx   eax, dl
893
           test    al, 1
894
           je      L28
895
           push    [__ymin]
896
           mov     ecx, [esp+24]
897
           push    dword [ecx]
898
           jmp     L51
899
L28:
900
           test    al, 2
901
           je      L31
902
           push    [__ymax]
903
           mov     edx, [esp+24]
904
           push    dword [edx]
905
L51:
906
           mov     eax, [esp+32]
907
           mov     edx, ebp
908
           mov     ecx, [eax]
909
           mov     eax, edi
910
           jmp     L49
911
L31:
912
           test    al, 4
913
           je      L33
914
           push    [__xmax]
915
           jmp     L52
916
L33:
917
           test    al, 8
918
           je      L30
919
           push    [__xmin]
920
L52:
921
           mov     edx, [esp+28]
922
           push    dword [edx]
923
           mov     edx, edi
924
           mov     eax, [esp+28]
925
           mov     ecx, [eax]
926
           mov     eax, ebp
927
L49:
928
           call    _line_inter
929
           pop     esi
930
           pop     eax
931
L30:
932
           mov     edx, [edi]
933
           mov     eax, [ebp]
934
           call    __L1OutCode
935
           jmp     L48
936
L26:
937
           movsx   eax, bl
938
           test    al, 1
939
           je      L36
940
           push    [__ymin]
941
           jmp     L53
942
L36:
943
           test    al, 2
944
           je      L39
945
           push    [__ymax]
946
L53:
947
           push    dword [ebp]
948
           mov     ecx, [edi]
949
           mov     edx, [esp+28]
950
           mov     eax, [esp+32]
951
           jmp     L50
952
L39:
953
           test    al, 4
954
           je      L41
955
           push    [__xmax]
956
           jmp     L54
957
L41:
958
           test    al, 8
959
           je      L38
960
           push    [__xmin]
961
L54:
962
           push    dword [edi]
963
           mov     ecx, [ebp]
964
           mov     edx, [esp+32]
965
           mov     eax, [esp+28]
966
L50:
967
           call    _line_inter
968
           pop     edx
969
           pop     ecx
970
L38:
971
           mov     ecx, [esp+24]
972
           mov     edx, [ecx]
973
           mov     ecx, [esp+20]
974
           mov     eax, [ecx]
975
           call    __L1OutCode
976
           mov     bl, al
977
           jmp     L47
978
L23:
979
           pop     ebx
980
           movsx   eax, al
981
           pop     esi
982
           pop     edi
983
           pop     ebp
984
           ret
985
 
986
align 4
987
_block_inter:
988
           test    cl, 1
989
           push    ebx
990
           mov     ebx, eax
991
           je      L57
992
           mov     eax, [__ymin]
993
           jmp     L66
994
L57:
995
           test    cl, 2
996
           je      L60
997
           mov     eax, [__ymax]
998
L66:
999
           mov     [edx], eax
1000
           jmp     L65
1001
L60:
1002
           test    cl, 4
1003
           je      L62
1004
           mov     eax, [__xmax]
1005
           jmp     L67
1006
L62:
1007
           and     cl, 8
1008
           je      L65
1009
           mov     eax, [__xmin]
1010
L67:
1011
           mov     [ebx], eax
1012
L65:
1013
           pop     ebx
1014
           ret
1015
 
1016
align 4
1017
_BlockClip:
1018
           push    ebp
1019
           push    edi
1020
           push    esi
1021
           push    ebx
1022
           mov     eax, [esp+24]
1023
           mov     ecx, [esp+20]
1024
           mov     ebp, [esp+28]
1025
           mov     edi, [esp+32]
1026
           mov     edx, [eax]
1027
           mov     eax, [ecx]
1028
           call    __L1OutCode
1029
           mov     edx, [edi]
1030
           mov     ebx, eax
1031
           mov     eax, [ebp]
1032
           call    __L1OutCode
1033
L80:
1034
           mov     esi, eax
1035
L79:
1036
           test    esi, ebx
1037
           jne     L70
1038
           cmp     ebx, esi
1039
           je      L72
1040
           test    ebx, ebx
1041
           jne     L74
1042
           mov     edx, edi
1043
           mov     eax, ebp
1044
           mov     ecx, esi
1045
           call    _block_inter
1046
           mov     edx, [edi]
1047
           mov     eax, [ebp]
1048
           call    __L1OutCode
1049
           jmp     L80
1050
L74:
1051
           mov     edx, [esp+24]
1052
           mov     ecx, ebx
1053
           mov     eax, [esp+20]
1054
           call    _block_inter
1055
           mov     eax, [esp+24]
1056
           mov     ecx, [esp+20]
1057
           mov     edx, [eax]
1058
           mov     eax, [ecx]
1059
           call    __L1OutCode
1060
           mov     ebx, eax
1061
           jmp     L79
1062
L72:
1063
           mov     esi, ebx
1064
L70:
1065
           mov     eax, esi
1066
           and     eax, ebx
1067
           pop     ebx
1068
           cwde
1069
           pop     esi
1070
           pop     edi
1071
           pop     ebp
1072
           ret