1 #include "pipe/p_context.h"
2 #include "pipe/p_format.h"
4 #include "nouveau_context.h"
7 nv50_format(enum pipe_format format
)
10 case PIPE_FORMAT_A8R8G8B8_UNORM
:
11 case PIPE_FORMAT_Z24S8_UNORM
:
12 return NV50_2D_DST_FORMAT_32BPP
;
13 case PIPE_FORMAT_X8R8G8B8_UNORM
:
14 return NV50_2D_DST_FORMAT_24BPP
;
15 case PIPE_FORMAT_R5G6B5_UNORM
:
16 return NV50_2D_DST_FORMAT_16BPP
;
17 case PIPE_FORMAT_A8_UNORM
:
18 return NV50_2D_DST_FORMAT_8BPP
;
25 nv50_surface_set(struct nouveau_context
*nv
, struct pipe_surface
*surf
, int dst
)
27 struct nouveau_channel
*chan
= nv
->nvc
->channel
;
28 struct nouveau_grobj
*eng2d
= nv
->nvc
->Nv2D
;
29 struct nouveau_bo
*bo
= nouveau_buffer(surf
->buffer
)->bo
;
30 int surf_format
, mthd
= dst
? NV50_2D_DST_FORMAT
: NV50_2D_SRC_FORMAT
;
31 int flags
= NOUVEAU_BO_VRAM
| (dst
? NOUVEAU_BO_WR
: NOUVEAU_BO_RD
);
33 surf_format
= nv50_format(surf
->format
);
37 if (!nouveau_bo(bo
)->tiled
) {
38 BEGIN_RING(chan
, eng2d
, mthd
, 2);
39 OUT_RING (chan
, surf_format
);
41 BEGIN_RING(chan
, eng2d
, mthd
+ 0x14, 5);
42 OUT_RING (chan
, surf
->stride
);
43 OUT_RING (chan
, surf
->width
);
44 OUT_RING (chan
, surf
->height
);
45 OUT_RELOCh(chan
, bo
, surf
->offset
, flags
);
46 OUT_RELOCl(chan
, bo
, surf
->offset
, flags
);
48 BEGIN_RING(chan
, eng2d
, mthd
, 5);
49 OUT_RING (chan
, surf_format
);
54 BEGIN_RING(chan
, eng2d
, mthd
+ 0x18, 4);
55 OUT_RING (chan
, surf
->width
);
56 OUT_RING (chan
, surf
->height
);
57 OUT_RELOCh(chan
, bo
, surf
->offset
, flags
);
58 OUT_RELOCl(chan
, bo
, surf
->offset
, flags
);
63 BEGIN_RING(chan
, eng2d
, NV50_2D_CLIP_X
, 4);
66 OUT_RING (chan
, surf
->width
);
67 OUT_RING (chan
, surf
->height
);
75 nv50_surface_copy_prep(struct nouveau_context
*nv
,
76 struct pipe_surface
*dst
, struct pipe_surface
*src
)
80 assert(src
->format
== dst
->format
);
82 ret
= nv50_surface_set(nv
, dst
, 1);
86 ret
= nv50_surface_set(nv
, src
, 0);
94 nv50_surface_copy(struct nouveau_context
*nv
, unsigned dx
, unsigned dy
,
95 unsigned sx
, unsigned sy
, unsigned w
, unsigned h
)
97 struct nouveau_channel
*chan
= nv
->nvc
->channel
;
98 struct nouveau_grobj
*eng2d
= nv
->nvc
->Nv2D
;
100 BEGIN_RING(chan
, eng2d
, 0x088c, 1);
102 BEGIN_RING(chan
, eng2d
, NV50_2D_BLIT_DST_X
, 4);
107 BEGIN_RING(chan
, eng2d
, 0x08c0, 4);
112 BEGIN_RING(chan
, eng2d
, 0x08d0, 4);
120 nv50_surface_copy_done(struct nouveau_context
*nv
)
122 FIRE_RING(nv
->nvc
->channel
);
126 nv50_surface_fill(struct nouveau_context
*nv
, struct pipe_surface
*dst
,
127 unsigned dx
, unsigned dy
, unsigned w
, unsigned h
,
130 struct nouveau_channel
*chan
= nv
->nvc
->channel
;
131 struct nouveau_grobj
*eng2d
= nv
->nvc
->Nv2D
;
132 int rect_format
, ret
;
134 rect_format
= nv50_format(dst
->format
);
138 ret
= nv50_surface_set(nv
, dst
, 1);
142 BEGIN_RING(chan
, eng2d
, 0x0580, 3);
144 OUT_RING (chan
, rect_format
);
145 OUT_RING (chan
, value
);
147 BEGIN_RING(chan
, eng2d
, NV50_2D_RECT_X1
, 4);
150 OUT_RING (chan
, dx
+ w
);
151 OUT_RING (chan
, dy
+ h
);
158 nouveau_surface_channel_create_nv50(struct nouveau_channel_context
*nvc
)
160 struct nouveau_channel
*chan
= nvc
->channel
;
161 struct nouveau_grobj
*eng2d
= NULL
;
164 ret
= nouveau_grobj_alloc(chan
, nvc
->next_handle
++, NV50_2D
, &eng2d
);
169 BIND_RING (chan
, eng2d
, nvc
->next_subchannel
++);
170 BEGIN_RING(chan
, eng2d
, NV50_2D_DMA_NOTIFY
, 4);
171 OUT_RING (chan
, nvc
->sync_notifier
->handle
);
172 OUT_RING (chan
, chan
->vram
->handle
);
173 OUT_RING (chan
, chan
->vram
->handle
);
174 OUT_RING (chan
, chan
->vram
->handle
);
175 BEGIN_RING(chan
, eng2d
, NV50_2D_OPERATION
, 1);
176 OUT_RING (chan
, NV50_2D_OPERATION_SRCCOPY
);
177 BEGIN_RING(chan
, eng2d
, 0x0290, 1);
179 BEGIN_RING(chan
, eng2d
, 0x0888, 1);
186 nouveau_surface_init_nv50(struct nouveau_context
*nv
)
188 nv
->surface_copy_prep
= nv50_surface_copy_prep
;
189 nv
->surface_copy
= nv50_surface_copy
;
190 nv
->surface_copy_done
= nv50_surface_copy_done
;
191 nv
->surface_fill
= nv50_surface_fill
;