Checkpoint of BW textured video work, filling out vertex submission stuff and

some more other state.
This commit is contained in:
Eric Anholt 2006-05-18 15:26:28 -07:00
parent 291770efc6
commit ad7ec6a24b
2 changed files with 115 additions and 61 deletions

View File

@ -1632,8 +1632,26 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#define STATE3D_DRAWING_RECTANGLE_BRW (CMD_3D | (0x01<<24) | (0x00<<16))
#define PRIMITIVE3D_BRW (CMD_3D | (0x03<<27) | (0x08<<16))
#define PRIM3D_BRW_POINTLIST 0x0
#define STATE3D_BASE_ADDRESS (CMD_3D | (0x01<<24) | (0x01<<16))
#define BASE_ADDRESS_MODIFY (1 << 0)
#define STATE3D_PIPELINED_POINTERS (CMD_3D | (0x00<<24) | (0x00<<16))
#define STATE3D_VERTEX_BUFFERS (CMD_3D | (0x03<<27) | (0x00<<24) | (0x08<<16))
#define VB0_BUFFER_INDEX_SHIFT 27
#define VB0_VERTEXDATA (0 << 26)
#define VB0_INSTANCEDATA (1 << 26)
#define VB0_BUFFER_PITCH_SHIFT 0
#define STATE3D_VERTEX_ELEMENTS (CMD_3D | (0x00<<24) | (0x09<<16))
#define VE0_VERTEX_BUFFER_INDEX_SHIFT 27
#define VE0_VALID (1 << 26)
#define VE0_FORMAT_SHIFT 16
#define VE0_OFFSET_SHIFT 0
#define PRIMITIVE3D_BRW (CMD_3D | (0x03<<27) | (0x03<<24) | (0x08<<16))
/* Primitive types are in brw_defines.h */
#define P3D0_TOPO_SHIFT 10
/* End regs for broadwater */

View File

@ -2115,6 +2115,14 @@ union intfloat {
float f;
};
static inline CARD32 float_as_int(float f)
{
union intfloat tmp;
tmp.f = f;
return tmp.ui;
}
#define OUT_RING_F(x) do { \
union intfloat _tmp; \
_tmp.f = x; \
@ -2632,6 +2640,9 @@ BroadwaterDisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
struct brw_surface_state *src_surf_state;
struct brw_sampler_state *src_sampler_state;
struct brw_cc_unit_state *cc_state;
struct brw_vs_unit_state *vs_state;
CARD32 *vb;
Bool first_output = TRUE;
ErrorF("BroadwaterDisplayVideoTextured: %dx%d (pitch %d)\n", width, height,
video_pitch);
@ -2662,8 +2673,8 @@ BroadwaterDisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
* here, but we should have synced the 3D engine if we've reached this point.
*/
/* XXX: Allocate space for our state buffers, and set up the state structure
* pointers.
/* XXX: Allocate space for our state buffers and vb, and set up the state
* structure pointers.
*/
/* Set up the state buffer for the destination surface */
@ -2703,11 +2714,14 @@ BroadwaterDisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
src_sampler_state->ss1.s_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
src_sampler_state->ss1.t_wrap_mode = BRW_TEXCOORDMODE_CLAMP;
/* Set up the vertex shader to be disabled (passthrough) */
memset(vs_state, 0, sizeof(*vs_state));
vs_state->vs6.vs_enable = FALSE;
/* XXX: Set up binding table state */
/* XXX: Set up the VF for however we send our prims */
/* XXX: Set up the SF kernel to do coord interp */
/* XXX: Set up the SF state */
/* XXX: Set up the clipper to do nothing for us, I think */
/* XXX: Set up the PS kernel (dispatched by WM) for convertiny YUV to RGB.
* The 3D driver does this as:
@ -2737,7 +2751,6 @@ BroadwaterDisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
OUT_RING(STATE3D_URB_FENCE |
UF0_CS_REALLOC |
UF0_VFE_REALLOC |
UF0_SF_REALLOC |
UF0_CLIP_REALLOC |
UF0_GS_REALLOC |
@ -2746,15 +2759,51 @@ BroadwaterDisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
((urb_gs_start + urb_gs_size) << UF1_GS_FENCE_SHIFT) |
((urb_vs_start + urb_vs_size) << UF1_VS_FENCE_SHIFT));
OUT_RING(((urb_cs_start + urb_cs_size) << UF2_CS_FENCE_SHIFT) |
((urb_vfe_start + urb_vfe_size) << UF2_VFE_FENCE_SHIFT) |
((urb_sf_start + urb_sf_size) << UF2_SF_FENCE_SHIFT));
OUT_RING(STATE3D_BASE_ADDRESS | 4);
OUT_RING(XXX | BASE_ADDRESS_MODIFY); /* general state base addr, 4k align */
OUT_RING(XXX | BASE_ADDRESS_MODIFY); /* surf state base addr, 4k align */
OUT_RING(0); /* media base addr, don't care */
OUT_RING(0); /* general state max addr, disabled */
OUT_RING(0); /* media object state max addr, disabled */
OUT_RING(STATE3D_PIPELINED_POINTERS | 5);
OUT_RING((char *)vs_state - general_state_base); /* 32 byte aligned */
OUT_RING(0); /* disable GS, resulting in passthrough */
OUT_RING(0); /* disable CLIP, resulting in passthrough */
OUT_RING((char *)sf_state - general_state_base); /* 32 byte aligned */
OUT_RING((char *)wm_state - general_state_base); /* 32 byte aligned */
OUT_RING((char *)color_calc_state - general_state_base); /* 64 byte aligned */
OUT_RING(STATE3D_DRAWING_RECTANGLE_BRW | 2);
OUT_RING(0x00000000); /* ymin, xmin */
OUT_RING((pScrn->virtualX - 1) |
(pScrn->virtualY - 1) << 16); /* ymax, xmax */
OUT_RING(0x00000000); /* yorigin, xorigin */
OUT_RING(STATE3D_VERTEX_BUFFERS | 2);
OUT_RING((0 << VB0_BUFFER_INDEX_SHIFT) |
VB0_VERTEXDATA |
(16 << VB0_BUFFER_PITCH_SHIFT));
OUT_RING(vb - pScrn->fbOffset);
OUT_RING(0xffffffff); /* Max index -- don't care */
/* Set up our vertex elements, sourced from the single vertex buffer. */
OUT_RING(STATE3D_VERTEX_ELEMENTS | XXX);
/* offset 0: X,Y */
OUT_RING((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) |
VE0_VALID |
(BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) |
(0 << VE0_OFFSET_SHIFT));
/* offset 8: S0, S1 */
OUT_RING(0);
OUT_RING((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) |
VE0_VALID |
(BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) |
(8 << VE0_OFFSET_SHIFT));
OUT_RING(0);
/* XXX: Set the locations of the sampler/surface/etc. state */
ADVANCE_LP_RING();
@ -2764,7 +2813,6 @@ BroadwaterDisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
dxo = dstRegion->extents.x1;
dyo = dstRegion->extents.y1;
#if 0
pbox = REGION_RECTS(dstRegion);
nbox = REGION_NUM_RECTS(dstRegion);
while (nbox--)
@ -2773,12 +2821,16 @@ BroadwaterDisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
int box_y1 = pbox->y1;
int box_x2 = pbox->x2;
int box_y2 = pbox->y2;
int j;
int i;
float src_scale_x, src_scale_y;
CARD32 vb[40];
float verts[4][2], tex[4][2], tex2[4][2];
int vert_data_count;
if (!first_output) {
/* XXX: idle */
}
pbox++;
src_scale_x = (float)src_w / (float)drw_w;
@ -2789,62 +2841,46 @@ BroadwaterDisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id,
else
vert_data_count = 40;
OUT_RING(MI_NOOP);
OUT_RING(MI_NOOP);
OUT_RING(MI_NOOP);
OUT_RING(MI_NOOP);
OUT_RING(MI_NOOP);
OUT_RING(MI_NOOP);
OUT_RING(MI_NOOP);
vb[i++] = box_x1;
vb[i++] = box_y1;
vb[i++] = box_x1 - dxo;
vb[i++] = box_y1 - dyo;
vb[i++] = box_x2;
vb[i++] = box_y1;
vb[i++] = box_x2 - dxo;
vb[i++] = box_y1 - dyo;
vb[i++] = box_x2;
vb[i++] = box_y2;
vb[i++] = box_x2 - dxo;
vb[i++] = box_y2 - dyo;
vb[i++] = box_x1;
vb[i++] = box_y2;
vb[i++] = box_x1 - dxo;
vb[i++] = box_y2 - dyo;
BEGIN_LP_RING(vert_data_count + 8);
OUT_RING(MI_NOOP);
OUT_RING(MI_NOOP);
OUT_RING(MI_NOOP);
OUT_RING(MI_NOOP);
OUT_RING(MI_NOOP);
OUT_RING(MI_NOOP);
OUT_RING(MI_NOOP);
/* vertex data */
OUT_RING(PRIMITIVE3D | PRIM3D_INLINE | PRIM3D_TRIFAN |
(vert_data_count - 1));
verts[0][0] = box_x1; verts[0][1] = box_y1;
verts[1][0] = box_x2; verts[1][1] = box_y1;
verts[2][0] = box_x2; verts[2][1] = box_y2;
verts[3][0] = box_x1; verts[3][1] = box_y2;
if (!planar) {
tex[0][0] = (box_x1 - dxo) * src_scale_x;
tex[0][1] = (box_y1 - dyo) * src_scale_y;
tex[1][0] = (box_x2 - dxo) * src_scale_x;
tex[1][1] = (box_y1 - dyo) * src_scale_y;
tex[2][0] = (box_x2 - dxo) * src_scale_x;
tex[2][1] = (box_y2 - dyo) * src_scale_y;
tex[3][0] = (box_x1 - dxo) * src_scale_x;
tex[3][1] = (box_y2 - dyo) * src_scale_y;
/* emit vertex buffer */
draw_poly(vb, verts, tex, NULL);
for (j = 0; j < vert_data_count; j++)
OUT_RING(vb[j]);
} else {
tex[0][0] = (box_x1 - dxo) * src_scale_x / 2.0;
tex[0][1] = (box_y1 - dyo) * src_scale_y / 2.0;
tex[1][0] = (box_x2 - dxo) * src_scale_x / 2.0;
tex[1][1] = (box_y1 - dyo) * src_scale_y / 2.0;
tex[2][0] = (box_x2 - dxo) * src_scale_x / 2.0;
tex[2][1] = (box_y2 - dyo) * src_scale_y / 2.0;
tex[3][0] = (box_x1 - dxo) * src_scale_x / 2.0;
tex[3][1] = (box_y2 - dyo) * src_scale_y / 2.0;
tex2[0][0] = (box_x1 - dxo) * src_scale_x;
tex2[0][1] = (box_y1 - dyo) * src_scale_y;
tex2[1][0] = (box_x2 - dxo) * src_scale_x;
tex2[1][1] = (box_y1 - dyo) * src_scale_y;
tex2[2][0] = (box_x2 - dxo) * src_scale_x;
tex2[2][1] = (box_y2 - dyo) * src_scale_y;
tex2[3][0] = (box_x1 - dxo) * src_scale_x;
tex2[3][1] = (box_y2 - dyo) * src_scale_y;
/* emit vertex buffer */
draw_poly(vb, verts, tex, tex2);
for (j = 0; j < vert_data_count; j++)
OUT_RING(vb[j]);
}
OUT_RING(PRIMITIVE3D_BRW | (_3DPRIM_TRIFAN << P3D0_TOPO_SHIFT) | 4);
OUT_RING(4); /* vertex count per instance */
OUT_RING(0); /* start vertex offset */
OUT_RING(1); /* single instance */
OUT_RING(0); /* start instance location */
OUT_RING(0); /* index buffer offset, ignored */
ADVANCE_LP_RING();
first_output = FALSE;
}
#endif
if (pI830->AccelInfoRec)
pI830->AccelInfoRec->NeedToSync = TRUE;