Move 965 render unit state to BOs.

This is a first step in a series of changes to avoid requiring a pinned object,
which gets in the way of doing non-root KMS.  This change appears to result in
about a 2-6% loss in x11perf -aa10text, which better algorithms in libdrm could
make up for (it hasn't really had to deal with code this bad before).
This commit is contained in:
Eric Anholt 2008-12-05 15:30:35 -08:00
parent 64b08ed5ad
commit 5d705de5d1
2 changed files with 269 additions and 138 deletions

View File

@ -1040,6 +1040,21 @@ intel_emit_reloc(drm_intel_bo *bo, uint32_t offset,
return target_bo->offset + target_offset;
}
static inline drm_intel_bo *
intel_bo_alloc_for_data(ScrnInfoPtr scrn, void *data, unsigned int size,
char *name)
{
I830Ptr pI830 = I830PTR(scrn);
drm_intel_bo *bo;
bo = drm_intel_bo_alloc(pI830->bufmgr, name, size, 4096);
if (!bo)
return NULL;
drm_intel_bo_subdata(bo, 0, size, data);
return bo;
}
extern const int I830PatternROP[16];
extern const int I830CopyROP[16];

View File

@ -423,6 +423,44 @@ typedef enum {
SAMPLER_STATE_EXTEND_COUNT
} sampler_state_extend_t;
typedef enum {
WM_KERNEL_NOMASK_AFFINE,
WM_KERNEL_NOMASK_PROJECTIVE,
WM_KERNEL_MASKCA_AFFINE,
WM_KERNEL_MASKCA_PROJECTIVE,
WM_KERNEL_MASKCA_SRCALPHA_AFFINE,
WM_KERNEL_MASKCA_SRCALPHA_PROJECTIVE,
WM_KERNEL_MASKNOCA_AFFINE,
WM_KERNEL_MASKNOCA_PROJECTIVE,
WM_KERNEL_COUNT
} wm_kernel_t;
#define KERNEL(kernel_enum, kernel, masked) \
[kernel_enum] = {&kernel, sizeof(kernel), masked}
struct wm_kernel_info {
void *data;
unsigned int size;
Bool has_mask;
} wm_kernels[] = {
KERNEL(WM_KERNEL_NOMASK_AFFINE,
ps_kernel_nomask_affine_static, FALSE),
KERNEL(WM_KERNEL_NOMASK_PROJECTIVE,
ps_kernel_nomask_projective_static, FALSE),
KERNEL(WM_KERNEL_MASKCA_AFFINE,
ps_kernel_maskca_affine_static, TRUE),
KERNEL(WM_KERNEL_MASKCA_PROJECTIVE,
ps_kernel_maskca_projective_static, TRUE),
KERNEL(WM_KERNEL_MASKCA_SRCALPHA_AFFINE,
ps_kernel_maskca_srcalpha_affine_static, TRUE),
KERNEL(WM_KERNEL_MASKCA_SRCALPHA_PROJECTIVE,
ps_kernel_maskca_srcalpha_projective_static, TRUE),
KERNEL(WM_KERNEL_MASKNOCA_AFFINE,
ps_kernel_masknoca_affine_static, TRUE),
KERNEL(WM_KERNEL_MASKNOCA_PROJECTIVE,
ps_kernel_masknoca_projective_static, TRUE),
};
#undef KERNEL
typedef struct _brw_cc_unit_state_padded {
struct brw_cc_unit_state state;
char pad[64 - sizeof (struct brw_cc_unit_state)];
@ -433,6 +471,12 @@ typedef struct brw_surface_state_padded {
char pad[32 - sizeof (struct brw_surface_state)];
} brw_surface_state_padded;
struct gen4_cc_unit_state {
/* Index by [src_blend][dst_blend] */
brw_cc_unit_state_padded cc_state[BRW_BLENDFACTOR_COUNT]
[BRW_BLENDFACTOR_COUNT];
};
/**
* Gen4 rendering state buffer structure.
*
@ -452,23 +496,6 @@ typedef struct _gen4_static_state {
KERNEL_DECL (ps_kernel_masknoca_affine);
KERNEL_DECL (ps_kernel_masknoca_projective);
struct brw_vs_unit_state vs_state;
PAD64 (brw_vs_unit_state, 0);
struct brw_sf_unit_state sf_state;
PAD64 (brw_sf_unit_state, 0);
struct brw_sf_unit_state sf_state_mask;
PAD64 (brw_sf_unit_state, 1);
WM_STATE_DECL (nomask_affine);
WM_STATE_DECL (nomask_projective);
WM_STATE_DECL (maskca_affine);
WM_STATE_DECL (maskca_projective);
WM_STATE_DECL (maskca_srcalpha_affine);
WM_STATE_DECL (maskca_srcalpha_projective);
WM_STATE_DECL (masknoca_affine);
WM_STATE_DECL (masknoca_projective);
/* Index by [src_filter][src_extend][mask_filter][mask_extend]. Two of
* the structs happen to add to 32 bytes.
*/
@ -479,12 +506,6 @@ typedef struct _gen4_static_state {
struct brw_sampler_legacy_border_color sampler_border_color;
PAD64 (brw_sampler_legacy_border_color, 0);
/* Index by [src_blend][dst_blend] */
brw_cc_unit_state_padded cc_state[BRW_BLENDFACTOR_COUNT]
[BRW_BLENDFACTOR_COUNT];
struct brw_cc_viewport cc_viewport;
PAD64 (brw_cc_viewport, 0);
} gen4_static_state_t;
typedef float gen4_vertex_buffer[VERTEX_BUFFER_SIZE];
@ -510,6 +531,17 @@ struct gen4_render_state {
gen4_static_state_t *static_state;
uint32_t static_state_offset;
drm_intel_bo *vs_state_bo;
drm_intel_bo *sf_state_bo;
drm_intel_bo *sf_mask_state_bo;
drm_intel_bo *cc_state_bo;
drm_intel_bo *wm_state_bo[WM_KERNEL_COUNT]
[SAMPLER_STATE_FILTER_COUNT]
[SAMPLER_STATE_EXTEND_COUNT]
[SAMPLER_STATE_FILTER_COUNT]
[SAMPLER_STATE_EXTEND_COUNT];
drm_intel_bo *wm_kernel_bo[WM_KERNEL_COUNT];
dri_bo* vertex_buffer_bo;
gen4_composite_op composite_op;
@ -527,9 +559,18 @@ struct gen4_render_state {
* calculate dA/dx and dA/dy. Hand these interpolation coefficients
* back to SF which then hands pixels off to WM.
*/
static void
sf_state_init (struct brw_sf_unit_state *sf_state, int kernel_offset)
static drm_intel_bo *
gen4_create_sf_state(ScrnInfoPtr scrn, int kernel_offset)
{
I830Ptr pI830 = I830PTR(scrn);
struct brw_sf_unit_state *sf_state;
drm_intel_bo *sf_state_bo;
sf_state_bo = drm_intel_bo_alloc(pI830->bufmgr, "gen4 SF state",
sizeof(*sf_state), 4096);
drm_intel_bo_map(sf_state_bo, TRUE);
sf_state = sf_state_bo->virtual;
memset(sf_state, 0, sizeof(*sf_state));
sf_state->thread0.grf_reg_count = BRW_GRF_BLOCKS(SF_KERNEL_NUM_GRF);
sf_state->sf1.single_program_flow = 1;
@ -561,6 +602,10 @@ sf_state_init (struct brw_sf_unit_state *sf_state, int kernel_offset)
assert((kernel_offset & 63) == 0);
sf_state->thread0.kernel_start_pointer = kernel_offset >> 6;
drm_intel_bo_unmap(sf_state_bo);
return sf_state_bo;
}
static void
@ -621,11 +666,17 @@ sampler_state_init (struct brw_sampler_state *sampler_state,
}
static void
cc_state_init (struct brw_cc_unit_state *cc_state,
cc_state_init (drm_intel_bo *cc_state_bo,
uint32_t cc_state_offset,
int src_blend,
int dst_blend,
int cc_viewport_offset)
drm_intel_bo *cc_vp_bo)
{
struct brw_cc_unit_state *cc_state;
cc_state = (struct brw_cc_unit_state *)((char *)cc_state_bo->virtual +
cc_state_offset);
memset(cc_state, 0, sizeof(*cc_state));
cc_state->cc0.stencil_enable = 0; /* disable stencil */
cc_state->cc2.depth_test = 0; /* disable depth test */
@ -634,8 +685,11 @@ cc_state_init (struct brw_cc_unit_state *cc_state,
cc_state->cc3.blend_enable = 1; /* enable color blend */
cc_state->cc3.alpha_test = 0; /* disable alpha test */
assert((cc_viewport_offset & 31) == 0);
cc_state->cc4.cc_viewport_state_offset = cc_viewport_offset >> 5;
cc_state->cc4.cc_viewport_state_offset =
intel_emit_reloc(cc_state_bo, cc_state_offset +
offsetof(struct brw_cc_unit_state, cc4),
cc_vp_bo, 0,
I915_GEM_DOMAIN_INSTRUCTION, 0) >> 5;
cc_state->cc5.dither_enable = 0; /* disable dither */
cc_state->cc5.logicop_func = 0xc; /* COPY */
@ -655,15 +709,29 @@ cc_state_init (struct brw_cc_unit_state *cc_state,
cc_state->cc6.dest_blend_factor = dst_blend;
}
static void
wm_state_init (struct brw_wm_unit_state *wm_state,
Bool has_mask,
int kernel_offset,
int sampler_state_offset)
static drm_intel_bo *
gen4_create_wm_state(ScrnInfoPtr scrn,
Bool has_mask, drm_intel_bo *kernel_bo,
uint32_t sampler_state_offset)
{
I830Ptr pI830 = I830PTR(scrn);
struct brw_wm_unit_state *wm_state;
drm_intel_bo *wm_state_bo;
wm_state_bo = drm_intel_bo_alloc(pI830->bufmgr, "gen4 WM state",
sizeof(*wm_state), 4096);
drm_intel_bo_map(wm_state_bo, TRUE);
wm_state = wm_state_bo->virtual;
memset(wm_state, 0, sizeof (*wm_state));
wm_state->thread0.grf_reg_count = BRW_GRF_BLOCKS(PS_KERNEL_NUM_GRF);
wm_state->thread1.single_program_flow = 0;
wm_state->thread0.kernel_start_pointer =
intel_emit_reloc(wm_state_bo,
offsetof(struct brw_wm_unit_state, thread0),
kernel_bo, wm_state->thread0.grf_reg_count << 1,
I915_GEM_DOMAIN_INSTRUCTION, 0) >> 6;
wm_state->thread1.single_program_flow = 0;
/* scratch space is not used in our kernel */
wm_state->thread2.scratch_space_base_pointer = 0;
@ -690,9 +758,6 @@ wm_state_init (struct brw_wm_unit_state *wm_state,
wm_state->wm5.enable_8_pix = 0;
wm_state->wm5.early_depth_test = 1;
assert((kernel_offset & 63) == 0);
wm_state->thread0.kernel_start_pointer = kernel_offset >> 6;
/* Each pair of attributes (src/mask coords) is two URB entries */
if (has_mask) {
wm_state->thread1.binding_table_entry_count = 3; /* 2 tex and fb */
@ -701,6 +766,76 @@ wm_state_init (struct brw_wm_unit_state *wm_state,
wm_state->thread1.binding_table_entry_count = 2; /* 1 tex and fb */
wm_state->thread3.urb_entry_read_length = 2;
}
drm_intel_bo_unmap(wm_state_bo);
return wm_state_bo;
}
static drm_intel_bo *
gen4_create_cc_viewport(ScrnInfoPtr scrn)
{
I830Ptr pI830 = I830PTR(scrn);
drm_intel_bo *bo;
struct brw_cc_viewport cc_viewport;
cc_viewport.min_depth = -1.e35;
cc_viewport.max_depth = 1.e35;
bo = drm_intel_bo_alloc(pI830->bufmgr, "gen4 render unit state",
sizeof(cc_viewport), 4096);
drm_intel_bo_subdata(bo, 0, sizeof(cc_viewport), &cc_viewport);
return bo;
}
static drm_intel_bo *
gen4_create_vs_unit_state(ScrnInfoPtr scrn)
{
struct brw_vs_unit_state vs_state;
memset(&vs_state, 0, sizeof(vs_state));
/* Set up the vertex shader to be disabled (passthrough) */
vs_state.thread4.nr_urb_entries = URB_VS_ENTRIES;
vs_state.thread4.urb_entry_allocation_size = URB_VS_ENTRY_SIZE - 1;
vs_state.vs6.vs_enable = 0;
vs_state.vs6.vert_cache_disable = 1;
return intel_bo_alloc_for_data(scrn, &vs_state, sizeof(vs_state),
"gen4 render VS state");
}
/**
* Set up all combinations of cc state: each blendfactor for source and
* dest.
*/
static drm_intel_bo *
gen4_create_cc_unit_state(ScrnInfoPtr scrn)
{
I830Ptr pI830 = I830PTR(scrn);
struct gen4_cc_unit_state *cc_state;
drm_intel_bo *cc_state_bo, *cc_vp_bo;
int i, j;
cc_vp_bo = gen4_create_cc_viewport(scrn);
cc_state_bo = drm_intel_bo_alloc(pI830->bufmgr, "gen4 CC state",
sizeof(*cc_state), 4096);
drm_intel_bo_map(cc_state_bo, TRUE);
cc_state = cc_state_bo->virtual;
for (i = 0; i < BRW_BLENDFACTOR_COUNT; i++) {
for (j = 0; j < BRW_BLENDFACTOR_COUNT; j++) {
cc_state_init(cc_state_bo,
offsetof(struct gen4_cc_unit_state,
cc_state[i][j].state),
i, j, cc_vp_bo);
}
}
drm_intel_bo_unmap(cc_state_bo);
drm_intel_bo_unreference(cc_vp_bo);
return cc_state_bo;
}
/**
@ -718,24 +853,8 @@ gen4_static_state_init (gen4_static_state_t *static_state,
KERNEL_COPY (sip_kernel);
KERNEL_COPY (sf_kernel);
KERNEL_COPY (sf_kernel_mask);
KERNEL_COPY (ps_kernel_nomask_affine);
KERNEL_COPY (ps_kernel_nomask_projective);
KERNEL_COPY (ps_kernel_maskca_affine);
KERNEL_COPY (ps_kernel_maskca_projective);
KERNEL_COPY (ps_kernel_maskca_srcalpha_affine);
KERNEL_COPY (ps_kernel_maskca_srcalpha_projective);
KERNEL_COPY (ps_kernel_masknoca_affine);
KERNEL_COPY (ps_kernel_masknoca_projective);
#undef KERNEL_COPY
/* Set up the vertex shader to be disabled (passthrough) */
memset(&static_state->vs_state, 0, sizeof(static_state->vs_state));
static_state->vs_state.thread4.nr_urb_entries = URB_VS_ENTRIES;
static_state->vs_state.thread4.urb_entry_allocation_size =
URB_VS_ENTRY_SIZE - 1;
static_state->vs_state.vs6.vs_enable = 0;
static_state->vs_state.vs6.vert_cache_disable = 1;
/* Set up the sampler border color (always transparent black) */
memset(&static_state->sampler_border_color, 0,
sizeof(static_state->sampler_border_color));
@ -744,16 +863,6 @@ gen4_static_state_init (gen4_static_state_t *static_state,
static_state->sampler_border_color.color[2] = 0; /* B */
static_state->sampler_border_color.color[3] = 0; /* A */
static_state->cc_viewport.min_depth = -1.e35;
static_state->cc_viewport.max_depth = 1.e35;
sf_state_init (&static_state->sf_state,
static_state_offset +
offsetof (gen4_static_state_t, sf_kernel));
sf_state_init (&static_state->sf_state_mask,
static_state_offset +
offsetof (gen4_static_state_t, sf_kernel_mask));
for (i = 0; i < SAMPLER_STATE_FILTER_COUNT; i++) {
for (j = 0; j < SAMPLER_STATE_EXTEND_COUNT; j++) {
for (k = 0; k < SAMPLER_STATE_FILTER_COUNT; k++) {
@ -772,42 +881,6 @@ gen4_static_state_init (gen4_static_state_t *static_state,
}
}
}
for (i = 0; i < BRW_BLENDFACTOR_COUNT; i++) {
for (j = 0; j < BRW_BLENDFACTOR_COUNT; j++) {
cc_state_init (&static_state->cc_state[i][j].state, i, j,
static_state_offset +
offsetof (gen4_static_state_t, cc_viewport));
}
}
#define SETUP_WM_STATE(kernel, has_mask) \
wm_state_init(&static_state->wm_state_ ## kernel [i][j][k][l], \
has_mask, \
static_state_offset + offsetof(gen4_static_state_t, \
ps_kernel_ ## kernel), \
static_state_offset + offsetof(gen4_static_state_t, \
sampler_state[i][j][k][l]));
for (i = 0; i < SAMPLER_STATE_FILTER_COUNT; i++) {
for (j = 0; j < SAMPLER_STATE_EXTEND_COUNT; j++) {
for (k = 0; k < SAMPLER_STATE_FILTER_COUNT; k++) {
for (l = 0; l < SAMPLER_STATE_EXTEND_COUNT; l++) {
SETUP_WM_STATE (nomask_affine, FALSE);
SETUP_WM_STATE (nomask_projective, FALSE);
SETUP_WM_STATE (maskca_affine, TRUE);
SETUP_WM_STATE (maskca_projective, TRUE);
SETUP_WM_STATE (maskca_srcalpha_affine, TRUE);
SETUP_WM_STATE (maskca_srcalpha_projective, TRUE);
SETUP_WM_STATE (masknoca_affine, TRUE);
SETUP_WM_STATE (masknoca_projective, TRUE);
}
}
}
}
#undef SETUP_WM_STATE
}
static uint32_t
@ -941,7 +1014,6 @@ i965_emit_composite_state(ScrnInfoPtr pScrn)
PicturePtr pDstPicture = composite_op->dest_picture;
PixmapPtr pMask = composite_op->mask;
PixmapPtr pDst = composite_op->dest;
uint32_t sf_state_offset;
sampler_state_filter_t src_filter = composite_op->src_filter;
sampler_state_filter_t mask_filter = composite_op->mask_filter;
sampler_state_extend_t src_extend = composite_op->src_extend;
@ -956,6 +1028,7 @@ i965_emit_composite_state(ScrnInfoPtr pScrn)
int state_base_offset;
uint32_t src_blend, dst_blend;
dri_bo *binding_table_bo = composite_op->binding_table_bo;
wm_kernel_t wm_kernel;
render_state->needs_state_emit = FALSE;
@ -1058,33 +1131,16 @@ i965_emit_composite_state(ScrnInfoPtr pScrn)
/* Set the pointers to the 3d pipeline state */
OUT_BATCH(BRW_3DSTATE_PIPELINED_POINTERS | 5);
assert((offsetof(gen4_static_state_t, vs_state) & 31) == 0);
OUT_BATCH(state_base_offset + offsetof(gen4_static_state_t, vs_state));
OUT_RELOC(render_state->vs_state_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
OUT_BATCH(BRW_GS_DISABLE); /* disable GS, resulting in passthrough */
OUT_BATCH(BRW_CLIP_DISABLE); /* disable CLIP, resulting in passthrough */
if (pMask) {
sf_state_offset = state_base_offset +
offsetof(gen4_static_state_t, sf_state_mask);
OUT_RELOC(render_state->sf_mask_state_bo,
I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
} else {
sf_state_offset = state_base_offset +
offsetof(gen4_static_state_t, sf_state);
OUT_RELOC(render_state->sf_state_bo,
I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
}
assert((sf_state_offset & 31) == 0);
OUT_BATCH(sf_state_offset);
/* Shorthand for long array lookup */
#define OUT_WM_KERNEL(kernel) do { \
uint32_t offset = state_base_offset + \
offsetof(gen4_static_state_t, \
wm_state_ ## kernel \
[src_filter] \
[src_extend] \
[mask_filter] \
[mask_extend]); \
assert((offset & 31) == 0); \
OUT_BATCH(offset); \
} while (0)
if (pMask) {
if (pMaskPicture->componentAlpha &&
@ -1092,34 +1148,36 @@ i965_emit_composite_state(ScrnInfoPtr pScrn)
{
if (i965_blend_op[op].src_alpha) {
if (is_affine)
OUT_WM_KERNEL(maskca_srcalpha_affine);
wm_kernel = WM_KERNEL_MASKCA_SRCALPHA_AFFINE;
else
OUT_WM_KERNEL(maskca_srcalpha_projective);
wm_kernel = WM_KERNEL_MASKCA_SRCALPHA_PROJECTIVE;
} else {
if (is_affine)
OUT_WM_KERNEL(maskca_affine);
wm_kernel = WM_KERNEL_MASKCA_AFFINE;
else
OUT_WM_KERNEL(maskca_projective);
wm_kernel = WM_KERNEL_MASKCA_PROJECTIVE;
}
} else {
if (is_affine)
OUT_WM_KERNEL(masknoca_affine);
wm_kernel = WM_KERNEL_MASKNOCA_AFFINE;
else
OUT_WM_KERNEL(masknoca_projective);
wm_kernel = WM_KERNEL_MASKNOCA_PROJECTIVE;
}
} else {
if (is_affine)
OUT_WM_KERNEL(nomask_affine);
wm_kernel = WM_KERNEL_NOMASK_AFFINE;
else
OUT_WM_KERNEL(nomask_projective);
wm_kernel = WM_KERNEL_NOMASK_PROJECTIVE;
}
#undef OUT_WM_KERNEL
OUT_RELOC(render_state->wm_state_bo[wm_kernel]
[src_filter][src_extend]
[mask_filter][mask_extend],
I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
/* 64 byte aligned */
assert((offsetof(gen4_static_state_t,
cc_state[src_blend][dst_blend]) & 63) == 0);
OUT_BATCH(state_base_offset +
offsetof(gen4_static_state_t, cc_state[src_blend][dst_blend]));
OUT_RELOC(render_state->cc_state_bo,
I915_GEM_DOMAIN_INSTRUCTION, 0,
offsetof(struct gen4_cc_unit_state,
cc_state[src_blend][dst_blend]));
/* URB fence */
OUT_BATCH(BRW_URB_FENCE |
@ -1590,7 +1648,9 @@ gen4_render_state_init(ScrnInfoPtr pScrn)
{
I830Ptr pI830 = I830PTR(pScrn);
struct gen4_render_state *render_state;
uint32_t static_state_offset;
int ret;
int i, j, k, l, m;
if (pI830->gen4_render_state == NULL)
pI830->gen4_render_state = calloc(sizeof(*render_state), 1);
@ -1598,6 +1658,7 @@ gen4_render_state_init(ScrnInfoPtr pScrn)
render_state = pI830->gen4_render_state;
render_state->static_state_offset = pI830->gen4_render_state_mem->offset;
static_state_offset = render_state->static_state_offset;
if (pI830->use_drm_mode) {
ret = dri_bo_map(pI830->gen4_render_state_mem->bo, 1);
@ -1611,9 +1672,51 @@ gen4_render_state_init(ScrnInfoPtr pScrn)
render_state->static_state = (gen4_static_state_t *)
(pI830->FbBase + render_state->static_state_offset);
}
gen4_static_state_init(render_state->static_state,
render_state->static_state_offset);
render_state->vs_state_bo = gen4_create_vs_unit_state(pScrn);
/* Set up the two SF states (one for blending with a mask, one without) */
render_state->sf_state_bo =
gen4_create_sf_state(pScrn, static_state_offset +
offsetof(gen4_static_state_t,
sf_kernel));
render_state->sf_mask_state_bo =
gen4_create_sf_state(pScrn, static_state_offset +
offsetof(gen4_static_state_t,
sf_kernel_mask));
for (m = 0; m < WM_KERNEL_COUNT; m++) {
render_state->wm_kernel_bo[m] =
intel_bo_alloc_for_data(pScrn,
wm_kernels[m].data, wm_kernels[m].size,
"WM kernel");
}
/* Set up the WM states: each filter/extend type for source and mask, per
* kernel.
*/
for (i = 0; i < SAMPLER_STATE_FILTER_COUNT; i++) {
for (j = 0; j < SAMPLER_STATE_EXTEND_COUNT; j++) {
for (k = 0; k < SAMPLER_STATE_FILTER_COUNT; k++) {
for (l = 0; l < SAMPLER_STATE_EXTEND_COUNT; l++) {
for (m = 0; m < WM_KERNEL_COUNT; m++) {
uint32_t sampler_offset = static_state_offset +
offsetof(gen4_static_state_t,
sampler_state[i][j][k][l]);
render_state->wm_state_bo[m][i][j][k][l] =
gen4_create_wm_state(pScrn,
wm_kernels[m].has_mask,
render_state->wm_kernel_bo[m],
sampler_offset);
}
}
}
}
}
render_state->cc_state_bo = gen4_create_cc_unit_state(pScrn);
}
/**
@ -1624,6 +1727,7 @@ gen4_render_state_cleanup(ScrnInfoPtr pScrn)
{
I830Ptr pI830 = I830PTR(pScrn);
struct gen4_render_state *render_state= pI830->gen4_render_state;
int i;
if (render_state->vertex_buffer_bo) {
dri_bo_unreference (render_state->vertex_buffer_bo);
@ -1635,6 +1739,18 @@ gen4_render_state_cleanup(ScrnInfoPtr pScrn)
dri_bo_unreference(pI830->gen4_render_state_mem->bo);
}
render_state->static_state = NULL;
drm_intel_bo_unreference(render_state->vs_state_bo);
render_state->vs_state_bo = NULL;
drm_intel_bo_unreference(render_state->sf_state_bo);
render_state->sf_state_bo = NULL;
drm_intel_bo_unreference(render_state->sf_mask_state_bo);
render_state->sf_mask_state_bo = NULL;
drm_intel_bo_unreference(render_state->cc_state_bo);
render_state->cc_state_bo = NULL;
for (i = 0; i < WM_KERNEL_COUNT; i++) {
drm_intel_bo_unreference(render_state->wm_kernel_bo[i]);
render_state->wm_kernel_bo[i] = NULL;
}
}
unsigned int