Subversion Repositories Kolibri OS

Rev

Rev 732 | 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
 
576
align 4
577
proc r500_HDraw stdcall, ioctl:dword
578
 
579
           mov ebx, [ioctl]
580
           mov eax, [ebx+io_code]
581
           cmp eax, LINE_2P
582
           ja .fail
583
 
584
           cmp eax, SRV_GETVERSION
585
           jne @F
586
 
587
           mov eax, [ebx+output]
588
           cmp [ebx+out_size], 4
589
           jne .fail
590
           mov [eax], dword API_VERSION
591
           xor eax, eax
592
           ret
593
@@:
594
           cmp eax, SOLID_FILL
595
           jne @F
596
 
597
           cmp [ebx+inp_size], 5
598
           jne .fail
599
 
600
           mov esi, [ebx+input]
601
           call solid_fill
602
           xor eax, eax
603
           ret
604
@@:
605
           cmp eax, LINE_2P
606
           jne @F
607
 
608
           cmp [ebx+inp_size], 5
609
           jne .fail
610
 
611
           mov esi, [ebx+input]
612
           call solid_line
613
           xor eax, eax
614
           ret
615
@@:
616
 
617
.fail:
618
           or eax, -1
619
           ret
620
endp
621
 
622
restore   handle
623
restore   io_code
624
restore   input
625
restore   inp_size
626
restore   output
627
restore   out_size
628
 
629
struc FILL
630
{
631
  .color  rd 1
632
  .x      rd 1
633
  .y      rd 1
634
  .w      rd 1
635
  .h      rd 1
636
}
637
 
638
virtual at 0
639
  FILL FILL
640
end virtual
641
 
642
struc LINE2P
643
{
644
  .color  rd 1
645
  .x1      rd 1
646
  .y1      rd 1
647
  .x2      rd 1
648
  .y2      rd 1
649
}
650
 
651
virtual at 0
652
  LINE2P LINE2P
653
end virtual
654
 
655
GXcopy  equ 3
656
 
657
; esi= input params
658
align 4
659
solid_fill:
660
 
734 serge 661
           mov ebx, [esi+FILL.x]
662
           mov ecx, [esi+FILL.y]
663
           mov eax, [esi+FILL.w]
664
           mov edx, [esi+FILL.h]
665
 
666
           lea eax, [eax+ebx-1]     ;x2
667
           lea edx, [edx+ecx-1]     ;y2
668
 
669
           push edx                 ;y2
670
           push eax                 ;x2
671
 
672
           mov eax, esp             ;&x2
673
           lea ebx, [esp+4]         ;&y2
674
 
675
           lea ecx, [esi+FILL.x]
676
           lea edx, [esi+FILL.y]
677
 
678
           push ebx                 ;&y2
679
           push eax                 ;&x2
680
           push edx                 ;&y1
681
           push ecx                 ;&x1
682
 
683
           call _BlockClip
684
           add esp, 16
685
           test eax, eax
686
           jnz .exit
687
 
732 serge 688
           mov edx, [R5xxRops+4+GXcopy*8]
689
           or edx, [rhd.control]
690
           or edx, (R5XX_GMC_BRUSH_SOLID_COLOR or R5XX_GMC_SRC_DATATYPE_COLOR)
691
 
692
           mov eax, 7
693
           call R5xxFIFOWait
694
 
695
           wrr R5XX_DP_GUI_MASTER_CNTL, edx
696
 
697
           mov eax, [esi+FILL.color]
698
           wrr R5XX_DP_BRUSH_FRGD_CLR, eax
699
 
700
           wrr R5XX_DP_WRITE_MASK, 0xFFFFFFFF
701
 
702
           wrr R5XX_DP_CNTL, (R5XX_DST_X_LEFT_TO_RIGHT or R5XX_DST_Y_TOP_TO_BOTTOM)
703
 
704
           mov eax, [rhd.dst_pitch_offset]
705
           wrr R5XX_DST_PITCH_OFFSET, eax
706
 
707
           mov ebx, [esi+FILL.y]
708
           shl ebx, 16
709
           mov bx, word [esi+FILL.x]
710
           wrr R5XX_DST_Y_X, ebx
711
 
734 serge 712
           mov ecx, [esp]               ;x2
713
           sub ecx, [esi+FILL.x]
714
           inc ecx                      ;w
715
 
716
           mov eax, [esp+4]             ;y2
717
           sub eax, [esi+FILL.y]
718
           inc eax                      ;h
719
 
720
;           mov ecx, [esi+FILL.w]
732 serge 721
           shl ecx, 16
734 serge 722
;           mov cx, word [esi+FILL.h]
723
           mov cx, ax                        ;w|h
732 serge 724
           wrr R5XX_DST_WIDTH_HEIGHT, ecx
734 serge 725
.exit:
726
           add esp, 8
732 serge 727
           ret
728
 
729
align 4
730
solid_line:
731
 
734 serge 732
           lea eax, [esi+LINE2P.y2]
733
           lea ebx, [esi+LINE2P.x2]
734
           lea ecx, [esi+LINE2P.y1]
735
           lea edx, [esi+LINE2P.x1]
736
 
737
           push eax
738
           push ebx
739
           push ecx
740
           push edx
741
 
742
           call _LineClip
743
           add esp, 16
744
           test eax, eax
745
           jnz .exit
746
 
732 serge 747
           mov eax, 7
748
           call R5xxFIFOWait
749
 
750
           mov edx, [R5xxRops+4+GXcopy*8]
751
           or edx, [rhd.control]
752
           or edx, (R5XX_GMC_BRUSH_SOLID_COLOR or R5XX_GMC_SRC_DATATYPE_COLOR)
753
 
754
           wrr R5XX_DST_LINE_PATCOUNT, (0x55 shl R5XX_BRES_CNTL_SHIFT)
755
           wrr R5XX_DP_GUI_MASTER_CNTL, edx
756
 
757
           mov eax, [esi+FILL.color]
758
           wrr R5XX_DP_BRUSH_FRGD_CLR, eax
759
 
760
           wrr R5XX_DP_WRITE_MASK, 0xFFFFFFFF
761
 
762
           mov eax, [rhd.dst_pitch_offset]
763
           wrr R5XX_DST_PITCH_OFFSET, eax
764
 
765
           mov ebx, [esi+LINE2P.y1]
766
           shl ebx, 16
767
           mov bx, word [esi+LINE2P.x1]
768
           wrr R5XX_DST_LINE_START, ebx
769
 
770
           mov ecx, [esi+LINE2P.y2]
771
           shl ecx, 16
772
           mov cx, word [esi+LINE2P.x2]
773
           wrr R5XX_DST_LINE_END, ecx
734 serge 774
.exit:
775
           ret
732 serge 776
 
734 serge 777
align 4
778
__L1OutCode:
779
           cmp     eax, [__xmin]
780
           mov     ecx, edx
781
           setl    dl
782
           sal     edx, 3
783
           cmp     eax, [__xmax]
784
           jle     L9
785
           or      edx, 4
786
L9:
787
           cmp     ecx, [__ymin]
788
           jge     L11
789
           or      edx, 1
790
L11:
791
           cmp     ecx, [__ymax]
792
           jle     L13
793
           or      edx, 2
794
L13:
795
           movzx   eax, dl
732 serge 796
           ret
734 serge 797
 
798
align 4
799
_line_inter:
800
           push    ebp
801
           mov     ebp, edx
802
           push    edi
803
           push    esi
804
           push    ebx
805
           sub     esp, 4
806
           mov     ebx, [eax]
807
           mov     [esp], eax
808
           mov     edx, [esp+24]
809
           mov     edi, [ebp]
810
           sub     ecx, ebx
811
           mov     eax, ecx
812
           sar     eax, 31
813
           sub     edx, edi
814
           mov     esi, eax
815
           xor     esi, ecx
816
           sub     esi, eax
817
           mov     eax, [esp+28]
818
           lea     ecx, [edx+edx]
819
           sub     eax, ebx
820
           cdq
821
           xor     eax, edx
822
           sub     eax, edx
823
           imul    ecx, eax
824
           test    ecx, ecx
825
           jle     L17
826
           add     ecx, esi
827
           jmp     L19
828
L17:
829
           sub     ecx, esi
830
L19:
831
           lea     edx, [esi+esi]
832
           mov     eax, ecx
833
           mov     ebx, edx
834
           cdq
835
           idiv    ebx
836
           lea     eax, [eax+edi]
837
           mov     [ebp], eax
838
           mov     eax, [esp]
839
           mov     edx, [esp+28]
840
           mov     [eax], edx
841
           pop     eax
842
           pop     ebx
843
           pop     esi
844
           pop     edi
845
           pop     ebp
846
           ret
847
 
848
_LineClip:
849
           push    ebp
850
           push    edi
851
           push    esi
852
           push    ebx
853
           mov     eax, [esp+24]
854
           mov     ecx, [esp+20]
855
           mov     ebp, [esp+28]
856
           mov     edi, [esp+32]
857
           mov     edx, [eax]
858
           mov     eax, [ecx]
859
           call    __L1OutCode
860
           mov     edx, [edi]
861
           mov     bl, al
862
           mov     eax, [ebp]
863
           call    __L1OutCode
864
L48:
865
           mov     esi, eax
866
L47:
867
           mov     eax, esi
868
           and     al, bl
869
           jne     L23
870
           mov     edx, esi
871
           cmp     bl, dl
872
           je      L23
873
           test    bl, bl
874
           jne     L26
875
           movsx   eax, dl
876
           test    al, 1
877
           je      L28
878
           push    [__ymin]
879
           mov     ecx, [esp+24]
880
           push    dword [ecx]
881
           jmp     L51
882
L28:
883
           test    al, 2
884
           je      L31
885
           push    [__ymax]
886
           mov     edx, [esp+24]
887
           push    dword [edx]
888
L51:
889
           mov     eax, [esp+32]
890
           mov     edx, ebp
891
           mov     ecx, [eax]
892
           mov     eax, edi
893
           jmp     L49
894
L31:
895
           test    al, 4
896
           je      L33
897
           push    [__xmax]
898
           jmp     L52
899
L33:
900
           test    al, 8
901
           je      L30
902
           push    [__xmin]
903
L52:
904
           mov     edx, [esp+28]
905
           push    dword [edx]
906
           mov     edx, edi
907
           mov     eax, [esp+28]
908
           mov     ecx, [eax]
909
           mov     eax, ebp
910
L49:
911
           call    _line_inter
912
           pop     esi
913
           pop     eax
914
L30:
915
           mov     edx, [edi]
916
           mov     eax, [ebp]
917
           call    __L1OutCode
918
           jmp     L48
919
L26:
920
           movsx   eax, bl
921
           test    al, 1
922
           je      L36
923
           push    [__ymin]
924
           jmp     L53
925
L36:
926
           test    al, 2
927
           je      L39
928
           push    [__ymax]
929
L53:
930
           push    dword [ebp]
931
           mov     ecx, [edi]
932
           mov     edx, [esp+28]
933
           mov     eax, [esp+32]
934
           jmp     L50
935
L39:
936
           test    al, 4
937
           je      L41
938
           push    [__xmax]
939
           jmp     L54
940
L41:
941
           test    al, 8
942
           je      L38
943
           push    [__xmin]
944
L54:
945
           push    dword [edi]
946
           mov     ecx, [ebp]
947
           mov     edx, [esp+32]
948
           mov     eax, [esp+28]
949
L50:
950
           call    _line_inter
951
           pop     edx
952
           pop     ecx
953
L38:
954
           mov     ecx, [esp+24]
955
           mov     edx, [ecx]
956
           mov     ecx, [esp+20]
957
           mov     eax, [ecx]
958
           call    __L1OutCode
959
           mov     bl, al
960
           jmp     L47
961
L23:
962
           pop     ebx
963
           movsx   eax, al
964
           pop     esi
965
           pop     edi
966
           pop     ebp
967
           ret
968
 
969
align 4
970
_block_inter:
971
           test    cl, 1
972
           push    ebx
973
           mov     ebx, eax
974
           je      L57
975
           mov     eax, [__ymin]
976
           jmp     L66
977
L57:
978
           test    cl, 2
979
           je      L60
980
           mov     eax, [__ymax]
981
L66:
982
           mov     [edx], eax
983
           jmp     L65
984
L60:
985
           test    cl, 4
986
           je      L62
987
           mov     eax, [__xmax]
988
           jmp     L67
989
L62:
990
           and     cl, 8
991
           je      L65
992
           mov     eax, [__xmin]
993
L67:
994
           mov     [ebx], eax
995
L65:
996
           pop     ebx
997
           ret
998
 
999
align 4
1000
_BlockClip:
1001
           push    ebp
1002
           push    edi
1003
           push    esi
1004
           push    ebx
1005
           mov     eax, [esp+24]
1006
           mov     ecx, [esp+20]
1007
           mov     ebp, [esp+28]
1008
           mov     edi, [esp+32]
1009
           mov     edx, [eax]
1010
           mov     eax, [ecx]
1011
           call    __L1OutCode
1012
           mov     edx, [edi]
1013
           mov     ebx, eax
1014
           mov     eax, [ebp]
1015
           call    __L1OutCode
1016
L80:
1017
           mov     esi, eax
1018
L79:
1019
           test    esi, ebx
1020
           jne     L70
1021
           cmp     ebx, esi
1022
           je      L72
1023
           test    ebx, ebx
1024
           jne     L74
1025
           mov     edx, edi
1026
           mov     eax, ebp
1027
           mov     ecx, esi
1028
           call    _block_inter
1029
           mov     edx, [edi]
1030
           mov     eax, [ebp]
1031
           call    __L1OutCode
1032
           jmp     L80
1033
L74:
1034
           mov     edx, [esp+24]
1035
           mov     ecx, ebx
1036
           mov     eax, [esp+20]
1037
           call    _block_inter
1038
           mov     eax, [esp+24]
1039
           mov     ecx, [esp+20]
1040
           mov     edx, [eax]
1041
           mov     eax, [ecx]
1042
           call    __L1OutCode
1043
           mov     ebx, eax
1044
           jmp     L79
1045
L72:
1046
           mov     esi, ebx
1047
L70:
1048
           mov     eax, esi
1049
           and     eax, ebx
1050
           pop     ebx
1051
           cwde
1052
           pop     esi
1053
           pop     edi
1054
           pop     ebp
1055
           ret