diff options
author | Keith his master's voice Packard <keithp@bw.jf.intel.com> | 2006-05-27 00:17:25 -0700 |
---|---|---|
committer | Keith his master's voice Packard <keithp@bw.jf.intel.com> | 2006-05-27 00:17:25 -0700 |
commit | 462a860af89ed855fe2b718342fcaf9c169af3fb (patch) | |
tree | 6f0be513186c12b67ef53b72aa0c8469bcefa84c /src | |
parent | 9ec7cf22e3f03c13524bb2d15711699dfcc02984 (diff) |
Rename BRW instructions, check video instruction generation. Doesnt lock up, but doesnt display anything either
Diffstat (limited to 'src')
-rw-r--r-- | src/i810_reg.h | 66 | ||||
-rw-r--r-- | src/i830_video.c | 110 |
2 files changed, 114 insertions, 62 deletions
diff --git a/src/i810_reg.h b/src/i810_reg.h index 0e13932a..19edad46 100644 --- a/src/i810_reg.h +++ b/src/i810_reg.h @@ -1612,11 +1612,50 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. /* * New regs for broadwater -- we need to split this file up sensibly somehow. */ -#define STATE3D_PIPELINE_SELECT (CMD_3D | (0x01<<24) | (0x04<<16)) +#define BRW_3D(Pipeline,Opcode,Subopcode) (CMD_3D | \ + ((Pipeline) << 27) | \ + ((Opcode) << 24) | \ + ((Subopcode) << 16)) + +#define BRW_URB_FENCE BRW_3D(0, 0, 0) +#define BRW_CS_URB_STATE BRW_3D(0, 0, 1) +#define BRW_CONSTANT_BUFFER BRW_3D(0, 0, 2) +#define BRW_STATE_PREFETCH BRW_3D(0, 0, 3) + +#define BRW_STATE_BASE_ADDRESS BRW_3D(0, 1, 1) +#define BRW_STATE_SIP BRW_3D(0, 1, 2) +#define BRW_PIPELINE_SELECT BRW_3D(0, 1, 4) + +#define BRW_MEDIA_STATE_POINTERS BRW_3D(2, 0, 0) +#define BRW_MEDIA_OBJECT BRW_3D(2, 1, 0) + +#define BRW_3DSTATE_PIPELINED_POINTERS BRW_3D(3, 0, 0) +#define BRW_3DSTATE_BINDING_TABLE_POINTERS BRW_3D(3, 0, 1) +#define BRW_3DSTATE_VERTEX_BUFFERS BRW_3D(3, 0, 8) +#define BRW_3DSTATE_VERTEX_ELEMENTS BRW_3D(3, 0, 9) +#define BRW_3DSTATE_INDEX_BUFFER BRW_3D(3, 0, 0xa) +#define BRW_3DSTATE_VF_STATISTICS BRW_3D(3, 0, 0xb) + +#define BRW_3DSTATE_DRAWING_RECTANGLE BRW_3D(3, 1, 0) +#define BRW_3DSTATE_CONSTANT_COLOR BRW_3D(3, 1, 1) +#define BRW_3DSTATE_SAMPLER_PALETTE_LOAD BRW_3D(3, 1, 2) +#define BRW_3DSTATE_CHROMA_KEY BRW_3D(3, 1, 4) +#define BRW_3DSTATE_DEPTH_BUFFER BRW_3D(3, 1, 5) +#define BRW_3DSTATE_POLY_STIPPLE_OFFSET BRW_3D(3, 1, 6) +#define BRW_3DSTATE_POLY_STIPPLE_PATTERN BRW_3D(3, 1, 7) +#define BRW_3DSTATE_LINE_STIPPLE BRW_3D(3, 1, 8) +#define BRW_3DSTATE_GLOBAL_DEPTH_OFFSET_CLAMP BRW_3D(3, 1, 9) +/* These two are BLC and CTG only, not BW or CL */ +#define BRW_3DSTATE_AA_LINE_PARAMS BRW_3D(3, 1, 0xa) +#define BRW_3DSTATE_GS_SVB_INDEX BRW_3D(3, 1, 0xb) + +#define BRW_PIPE_CONTROL BRW_3D(3, 2, 0) + +#define BRW_3DPRIMITIVE BRW_3D(3, 3, 0) + #define PIPELINE_SELECT_3D 0 #define PIPELINE_SELECT_MEDIA 1 -#define STATE3D_URB_FENCE (CMD_3D | (0x00<<24) | (0x00<<16)) #define UF0_CS_REALLOC (1 << 13) #define UF0_VFE_REALLOC (1 << 12) #define UF0_SF_REALLOC (1 << 11) @@ -1630,20 +1669,22 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define UF2_VFE_FENCE_SHIFT 10 #define UF2_SF_FENCE_SHIFT 0 -#define STATE3D_DRAWING_RECTANGLE_BRW (CMD_3D | (0x01<<24) | (0x00<<16)) - -#define STATE3D_BASE_ADDRESS (CMD_3D | (0x01<<24) | (0x01<<16)) +/* for BRW_STATE_BASE_ADDRESS */ #define BASE_ADDRESS_MODIFY (1 << 0) -#define STATE3D_PIPELINED_POINTERS (CMD_3D | (0x00<<24) | (0x00<<16)) +/* for BRW_3DSTATE_PIPELINED_POINTERS */ +#define BRW_GS_DISABLE 0 +#define BRW_GS_ENABLE 1 +#define BRW_CLIP_DISABLE 0 +#define BRW_CLIP_ENABLE 1 -#define STATE3D_VERTEX_BUFFERS (CMD_3D | (0x03<<27) | (0x00<<24) | (0x08<<16)) +/* VERTEX_BUFFER_STATE Structure */ #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)) +/* VERTEX_ELEMENT_STATE Structure */ #define VE0_VERTEX_BUFFER_INDEX_SHIFT 27 #define VE0_VALID (1 << 26) #define VE0_FORMAT_SHIFT 16 @@ -1654,11 +1695,12 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define VE1_VFCOMPONENT_3_SHIFT 16 #define VE1_DESTINATION_ELEMENT_OFFSET_SHIFT 0 -#define STATE3D_BINDING_TABLE_POINTERS (CMD_3D | (0x03<<27) | (0x00<<24) | (0x01<<16)) - -#define PRIMITIVE3D_BRW (CMD_3D | (0x03<<27) | (0x03<<24) | (0x08<<16)) +/* 3DPRIMITIVE bits */ +#define BRW_3DPRIMITIVE_VERTEX_SEQUENTIAL (0 << 15) +#define BRW_3DPRIMITIVE_VERTEX_RANDOM (1 << 15) /* Primitive types are in brw_defines.h */ -#define P3D0_TOPO_SHIFT 10 +#define BRW_3DPRIMITIVE_TOPOLOGY_SHIFT 10 + /* End regs for broadwater */ diff --git a/src/i830_video.c b/src/i830_video.c index dca6a78e..225f9a9f 100644 --- a/src/i830_video.c +++ b/src/i830_video.c @@ -2618,9 +2618,12 @@ I915DisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id, * with the base texture coordinate. It was extracted from the Mesa driver */ -#define SF_KERNEL_NUM_GRF 10 +#define SF_KERNEL_NUM_GRF 10 +#define SF_KERNEL_NUM_URB 8 +#define SF_MAX_THREADS static const CARD32 sf_kernel_static[][4] = { +#if 0 /* send 0 (1) g6<1>F g1.8<0,1,0>F math mlen 1 rlen 1 { align1 + } */ { 0x00000031, 0x20c01fbd, 0x00000028, 0x01110081 }, /* mov (2) g3.8<1>F g2<2,2,1>F { align1 + } */ @@ -2655,6 +2658,7 @@ static const CARD32 sf_kernel_static[][4] = { { 0x00600041, 0x204077be, 0x008d0120, 0x000000c0 }, /* mov (8) m3<1>F g3<8,8,1>F { align1 + } */ { 0x00600001, 0x206003be, 0x008d0060, 0x00000000 }, +#endif /* send 0 (8) a0<1>F g0<8,8,1>F urb mlen 4 rlen 0 write +0 transpose used complete EOT{ align1 + } */ { 0x00600031, 0x20001fbc, 0x008d0000, 0x8640c800 }, /* nop (4) g0<1>UD { align1 + } */ @@ -2676,6 +2680,8 @@ static const CARD32 sf_kernel_static[][4] = { }; #define PS_KERNEL_NUM_GRF 10 +#define PS_KERNEL_NUM_URB 8 +#define WM_MAX_THREADS MIN(12, PS_KERNEL_NUM_URB / 2) static const CARD32 ps_kernel_static[][4] = { /* mov (8) m2<1>F g2<16,16,1>UW { align1 + } */ @@ -2696,7 +2702,8 @@ static const CARD32 ps_kernel_static[][4] = { { 0x00601001, 0x2120013e, 0x00b100c0, 0x00000000 }, /* mov (8) m1<1>F g1<8,8,1>F { align1 mask_disable + } */ { 0x00600201, 0x202003be, 0x008d0020, 0x00000000 }, -/* send 0 (16) a0<1>UW g0<8,8,1>UW write mlen 10 rlen 0 EOT{ align1 + } */ { 0x00800031, 0x20001d28, 0x008d0000, 0x85a04800 }, +/* send 0 (16) a0<1>UW g0<8,8,1>UW write mlen 10 rlen 0 EOT{ align1 + } */ + { 0x00800031, 0x20001d28, 0x008d0000, 0x85a04800 }, /* nop (4) g0<1>UD { align1 + } */ { 0x0040007e, 0x20000c21, 0x00690000, 0x00000000 }, /* nop (4) g0<1>UD { align1 + } */ @@ -2749,15 +2756,16 @@ BroadwaterDisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id, struct brw_instruction *ps_kernel; CARD32 *vb, *binding_table; Bool first_output = TRUE; - int surf_state_base_offset, general_state_base_offset; int dest_surf_offset, src_surf_offset, src_sampler_offset, vs_offset; int sf_offset, wm_offset, cc_offset, vb_offset, cc_viewport_offset; + int wm_scratch_offset; int sf_kernel_offset, ps_kernel_offset; int binding_table_offset; int next_offset, total_state_size; int vb_size = (4 * 4) * 4; /* 4 DWORDS per vertex */ FBLinearPtr state_area; char *state_base; + int state_base_offset; ErrorF("BroadwaterDisplayVideoTextured: %dx%d (pitch %d)\n", width, height, video_pitch); @@ -2774,12 +2782,13 @@ BroadwaterDisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id, /* Set up our layout of state in framebuffer. First the general state: */ vs_offset = ALIGN(next_offset, 64); - general_state_base_offset = vs_offset; next_offset = vs_offset + sizeof(*vs_state); sf_offset = ALIGN(next_offset, 32); next_offset = sf_offset + sizeof(*sf_state); wm_offset = ALIGN(next_offset, 32); next_offset = wm_offset + sizeof(*wm_state); + wm_scratch_offset = ALIGN(next_offset, 1024); + next_offset = wm_scratch_offset + 1024 * WM_MAX_THREADS; cc_offset = ALIGN(next_offset, 32); next_offset = cc_offset + sizeof(*cc_state); @@ -2800,7 +2809,6 @@ BroadwaterDisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id, /* And then the general state: */ dest_surf_offset = ALIGN(next_offset, 32); - surf_state_base_offset = dest_surf_offset; next_offset = dest_surf_offset + sizeof(*dest_surf_state); src_surf_offset = ALIGN(next_offset, 32); next_offset = src_surf_offset + sizeof(*src_surf_state); @@ -2809,15 +2817,16 @@ BroadwaterDisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id, /* Allocate an area in framebuffer for our state layout we just set up */ total_state_size = next_offset; - state_area = I830AllocateMemory(pScrn, NULL, (total_state_size + 32) / + state_area = I830AllocateMemory(pScrn, NULL, (total_state_size + 64) / pI830->cpp); if (state_area == NULL) { ErrorF("Failed to allocate %d bytes for state\n", total_state_size); return; } - state_base = (char *)(pI830->FbBase + pPriv->linear->offset * - pI830->cpp); + state_base_offset = pI830->FrontBuffer.Start + pPriv->linear->offset * pI830->cpp; + state_base_offset = ALIGN(state_base_offset, 64); + state_base = (char *)(pI830->FbBase + state_base_offset); /* Set up our pointers to state structures in framebuffer. It would probably * be a good idea to fill these structures out in system memory and then dump * them there, instead. @@ -2884,8 +2893,8 @@ BroadwaterDisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id, /* Set up a binding table for our two surfaces. Only the PS will use it */ /* XXX: are these offset from the right place? */ - binding_table[0] = dest_surf_offset - surf_state_base_offset; - binding_table[1] = src_surf_offset - surf_state_base_offset; + binding_table[0] = state_base_offset + dest_surf_offset; + binding_table[1] = state_base_offset + src_surf_offset; /* Set up the packed YUV source sampler. Doesn't do colorspace conversion. */ @@ -2905,14 +2914,14 @@ BroadwaterDisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id, */ memset(sf_state, 0, sizeof(*sf_state)); - sf_state->thread0.kernel_start_pointer = sf_kernel_offset - general_state_base_offset; + sf_state->thread0.kernel_start_pointer = state_base_offset + sf_kernel_offset; sf_state->thread0.grf_reg_count = ((SF_KERNEL_NUM_GRF + 15) / 16) - 1; sf_state->thread1.single_program_flow = 1; /* XXX */ - sf_state->thread2.scratch_space_base_pointer = 0; /* XXX 1k aligned */ - sf_state->thread4.nr_urb_entries = 8; + sf_state->thread2.per_thread_scratch_space = 0; + sf_state->thread2.scratch_space_base_pointer = 0; /* not used in our kernel */ + sf_state->thread4.nr_urb_entries = SF_KERNEL_NUM_URB; sf_state->thread4.urb_entry_allocation_size = 11; - sf_state->thread4.max_threads = MIN(12, sf_state->thread4.nr_urb_entries / - 2) - 1; + sf_state->thread4.max_threads = WM_MAX_THREADS - 1; sf_state->sf5.viewport_transform = FALSE; /* skip viewport */ sf_state->sf6.cull_mode = BRW_CULLMODE_BOTH; sf_state->sf6.scissor = 0; /* XXX */ @@ -2933,7 +2942,7 @@ BroadwaterDisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id, * */ - wm_state->thread0.kernel_start_pointer = ps_kernel_offset - general_state_base_offset; + wm_state->thread0.kernel_start_pointer = state_base_offset + ps_kernel_offset; wm_state->thread0.grf_reg_count = ((PS_KERNEL_NUM_GRF + 15) / 16) - 1; wm_state->thread1.binding_table_entry_count = 2; wm_state->thread2.scratch_space_base_pointer = 0; /* XXX */ @@ -2941,8 +2950,7 @@ BroadwaterDisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id, wm_state->thread3.dispatch_grf_start_reg = 0; /* XXX */ wm_state->thread3.urb_entry_read_length = 4; /* XXX */ wm_state->thread3.const_urb_entry_read_length = 0; /* XXX */ - wm_state->wm4.sampler_state_pointer = - (src_sampler_offset - general_state_base_offset) >> 5; + wm_state->wm4.sampler_state_pointer = (state_base_offset + src_sampler_offset) >> 5; wm_state->wm4.sampler_count = 1; /* 1-4 samplers used */ wm_state->wm5.max_threads = 0; wm_state->wm5.thread_dispatch_enable = 1; @@ -2952,8 +2960,7 @@ BroadwaterDisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id, cc_viewport->max_depth = 0.0; memset(cc_state, 0, sizeof(*cc_state)); - cc_state->cc4.cc_viewport_state_offset = - (cc_viewport_offset - general_state_base_offset) >> 5; + cc_state->cc4.cc_viewport_state_offset = (state_base_offset + cc_viewport_offset) >> 5; memcpy (sf_kernel, sf_kernel_static, sizeof (sf_kernel_static)); memcpy (ps_kernel, ps_kernel_static, sizeof (ps_kernel_static)); @@ -2961,66 +2968,65 @@ BroadwaterDisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id, BEGIN_LP_RING(38); OUT_RING(MI_FLUSH | MI_STATE_INSTRUCTION_CACHE_FLUSH); - OUT_RING(STATE3D_PIPELINE_SELECT | PIPELINE_SELECT_3D); + OUT_RING(BRW_PIPELINE_SELECT | PIPELINE_SELECT_3D); - OUT_RING(STATE3D_URB_FENCE | + OUT_RING(BRW_URB_FENCE | UF0_CS_REALLOC | UF0_SF_REALLOC | UF0_CLIP_REALLOC | UF0_GS_REALLOC | - UF0_VS_REALLOC); + UF0_VS_REALLOC | + 1); OUT_RING(((urb_clip_start + urb_clip_size) << UF1_CLIP_FENCE_SHIFT) | ((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_sf_start + urb_sf_size) << UF2_SF_FENCE_SHIFT)); - /* Set the general and surface state base addresses */ - OUT_RING(STATE3D_BASE_ADDRESS | 4); - OUT_RING((pPriv->linear->offset * pI830->cpp + general_state_base_offset) | - BASE_ADDRESS_MODIFY); - OUT_RING((pPriv->linear->offset * pI830->cpp + surf_state_base_offset) | - BASE_ADDRESS_MODIFY); + /* Zero out the two base address registers so all offsets are absolute */ + OUT_RING(BRW_STATE_BASE_ADDRESS | 4); + OUT_RING(0 | BASE_ADDRESS_MODIFY); /* Generate state base address */ + OUT_RING(0 | BASE_ADDRESS_MODIFY); /* Surface state base address */ 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 */ /* Set the pointers to the 3d pipeline state */ - OUT_RING(STATE3D_PIPELINED_POINTERS | 5); - OUT_RING(vs_offset - general_state_base_offset); /* 32 byte aligned */ - OUT_RING(0); /* disable GS, resulting in passthrough */ - OUT_RING(0); /* disable CLIP, resulting in passthrough */ - OUT_RING(sf_offset - general_state_base_offset); /* 32 byte aligned */ - OUT_RING(wm_offset - general_state_base_offset); /* 32 byte aligned */ - OUT_RING(cc_offset - general_state_base_offset); /* 64 byte aligned */ + OUT_RING(BRW_3DSTATE_PIPELINED_POINTERS | 5); + OUT_RING(state_base_offset + vs_offset); /* 32 byte aligned */ + OUT_RING(BRW_GS_DISABLE); /* disable GS, resulting in passthrough */ + OUT_RING(BRW_CLIP_DISABLE); /* disable CLIP, resulting in passthrough */ + OUT_RING(state_base_offset + sf_offset); /* 32 byte aligned */ + OUT_RING(state_base_offset + wm_offset); /* 32 byte aligned */ + OUT_RING(state_base_offset + cc_offset); /* 64 byte aligned */ /* Only the PS uses the binding table */ - OUT_RING(STATE3D_BINDING_TABLE_POINTERS | 4); + OUT_RING(BRW_3DSTATE_BINDING_TABLE_POINTERS | 4); OUT_RING(0); /* vs */ OUT_RING(0); /* gs */ OUT_RING(0); /* clip */ OUT_RING(0); /* sf */ - OUT_RING(binding_table_offset - surf_state_base_offset); /* ps */ + OUT_RING(state_base_offset + binding_table_offset); /* ps */ /* The drawing rectangle clipping is always on. Set it to values that * shouldn't do any clipping. */ - OUT_RING(STATE3D_DRAWING_RECTANGLE_BRW | 2); + OUT_RING(BRW_3DSTATE_DRAWING_RECTANGLE | 2); /* XXX 3 for BLC or CTG */ OUT_RING(0x00000000); /* ymin, xmin */ OUT_RING((pScrn->virtualX - 1) | (pScrn->virtualY - 1) << 16); /* ymax, xmax */ OUT_RING(0x00000000); /* yorigin, xorigin */ /* Set up the pointer to our vertex buffer */ - OUT_RING(STATE3D_VERTEX_BUFFERS | 2); + OUT_RING(BRW_3DSTATE_VERTEX_BUFFERS | 2); OUT_RING((0 << VB0_BUFFER_INDEX_SHIFT) | VB0_VERTEXDATA | - (16 << VB0_BUFFER_PITCH_SHIFT)); - OUT_RING(pPriv->linear->offset * pI830->cpp + vb_offset); - OUT_RING(0xffffffff); /* Max index -- don't care */ + ((4 * 4) << VB0_BUFFER_PITCH_SHIFT)); /* four 32-bit floats per vertex */ + OUT_RING(state_base_offset + vb_offset); + OUT_RING(4); /* four corners to our rectangle */ /* Set up our vertex elements, sourced from the single vertex buffer. */ - OUT_RING(STATE3D_VERTEX_ELEMENTS | 3); + OUT_RING(BRW_3DSTATE_VERTEX_ELEMENTS | 3); /* offset 0: X,Y -> {X, Y, 0.0, 0.0} */ OUT_RING((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) | VE0_VALID | @@ -3052,10 +3058,10 @@ BroadwaterDisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id, nbox = REGION_NUM_RECTS(dstRegion); while (nbox--) { - int box_x1 = pbox->x1; - int box_y1 = pbox->y1; - int box_x2 = pbox->x2; - int box_y2 = pbox->y2; + int box_x1 = pbox->x1 - pbox->x1; + int box_y1 = pbox->y1 - pbox->y1; + int box_x2 = pbox->x2 - pbox->x1; + int box_y2 = pbox->y2 - pbox->y1; int i; float src_scale_x, src_scale_y; CARD32 vb[40]; @@ -3112,8 +3118,12 @@ BroadwaterDisplayVideoTextured(ScrnInfoPtr pScrn, I830PortPrivPtr pPriv, int id, vb[i++] = (box_y2 - dyo) * src_scale_y; BEGIN_LP_RING(6); - OUT_RING(PRIMITIVE3D_BRW | (_3DPRIM_TRIFAN << P3D0_TOPO_SHIFT) | 4); - OUT_RING(4); /* vertex count per instance */ + OUT_RING(BRW_3DPRIMITIVE | + BRW_3DPRIMITIVE_VERTEX_SEQUENTIAL | + (_3DPRIM_TRIFAN << BRW_3DPRIMITIVE_TOPOLOGY_SHIFT) | + (0 << 9) | + 4); + OUT_RING(4); /* vertex count per instance XXX should this be 3 or 6? */ OUT_RING(0); /* start vertex offset */ OUT_RING(1); /* single instance */ OUT_RING(0); /* start instance location */ |