Subversion Repositories Kolibri OS

Rev

Rev 732 | Blame | Last modification | View Log | Download | RSS feed

  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 <lverhaegen@novell.com>
  9.  Copyright 2008  Matthias Hopf <mhopf@novell.com>
  10.  Copyright 2008  Egbert Eich   <eich@novell.com>
  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 <martin@xfree86.org>
  64.    Rickard E. Faith <faith@valinux.com>
  65.    Alan Hourihane <alanh@fairlite.demon.co.uk>
  66.  
  67. end if
  68.  
  69. D1GRPH_PITCH                     equ 0x6120
  70. D1GRPH_X_END                     equ 0x6134
  71. D1GRPH_Y_END                     equ 0x6138
  72.  
  73.  
  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.  
  235. R5XX_SRC_Y_X                        equ  0x1434
  236.  
  237. R5XX_DST_Y_X                        equ  0x1438
  238. R5XX_DST_HEIGHT_WIDTH               equ  0x143c
  239. R5XX_DST_WIDTH_HEIGHT               equ  0x1598
  240.  
  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.  
  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.  
  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
  472.  
  473.            mov [rhd.datatype], R5XX_DATATYPE_ARGB8888
  474.            mov [rhd.surface_cntl],0
  475.  
  476.            rdr eax, D1GRPH_PITCH
  477.            shl eax, 18
  478.  
  479.            mov ebx, [r500_LFB]
  480.            shr ebx, 10
  481.            or eax, ebx
  482.  
  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
  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.  
  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.  
  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
  561.  
  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.  
  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.  
  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.  
  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]
  721.            shl ecx, 16
  722. ;           mov cx, word [esi+FILL.h]
  723.            mov cx, ax                        ;w|h
  724.            wrr R5XX_DST_WIDTH_HEIGHT, ecx
  725. .exit:
  726.            add esp, 8
  727.            ret
  728.  
  729. align 4
  730. solid_line:
  731.  
  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.  
  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
  774. .exit:
  775.            ret
  776.  
  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
  796.            ret
  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
  1056.