summaryrefslogtreecommitdiff
path: root/src/xvmc/i915_xvmc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/xvmc/i915_xvmc.c')
-rw-r--r--src/xvmc/i915_xvmc.c79
1 files changed, 44 insertions, 35 deletions
diff --git a/src/xvmc/i915_xvmc.c b/src/xvmc/i915_xvmc.c
index 4195cba2..20def141 100644
--- a/src/xvmc/i915_xvmc.c
+++ b/src/xvmc/i915_xvmc.c
@@ -103,8 +103,6 @@ static void i915_mc_one_time_context_init(XvMCContext * context)
struct i915_3dstate_pixel_shader_program *pixel_shader_program;
struct i915_3dstate_pixel_shader_constants *pixel_shader_constants;
- /* sampler static state */
- sampler_state = (struct i915_3dstate_sampler_state *)pI915XvMC->ssb.map;
/* pixel shader static state */
pixel_shader_program =
(struct i915_3dstate_pixel_shader_program *)pI915XvMC->psp.map;
@@ -112,6 +110,10 @@ static void i915_mc_one_time_context_init(XvMCContext * context)
pixel_shader_constants =
(struct i915_3dstate_pixel_shader_constants *)pI915XvMC->psc.map;
+ /* sampler static state */
+ drm_intel_gem_bo_map_gtt(pI915XvMC->ssb_bo);
+ sampler_state = pI915XvMC->ssb_bo->virtual;
+
memset(sampler_state, 0, sizeof(*sampler_state));
sampler_state->dw0.type = CMD_3D;
sampler_state->dw0.opcode = OPC_3DSTATE_SAMPLER_STATE;
@@ -166,6 +168,8 @@ static void i915_mc_one_time_context_init(XvMCContext * context)
sampler_state->sampler1.ts1.east_deinterlacer = 0;
sampler_state->sampler1.ts2.default_color = 0;
+ drm_intel_gem_bo_unmap_gtt(pI915XvMC->ssb_bo);
+
memset(pixel_shader_program, 0, sizeof(*pixel_shader_program));
pixel_shader_program->shader0.type = CMD_3D;
pixel_shader_program->shader0.opcode = OPC_3DSTATE_PIXEL_SHADER_PROGRAM;
@@ -316,7 +320,6 @@ static void i915_mc_one_time_context_init(XvMCContext * context)
pixel_shader_constants->value.y = 0.5;
pixel_shader_constants->value.z = 0.5;
pixel_shader_constants->value.w = 0.5;
-
}
static void i915_mc_one_time_state_emit(XvMCContext * context)
@@ -366,11 +369,8 @@ static void i915_mc_one_time_state_emit(XvMCContext * context)
OUT_BATCH(0); /* no dynamic indirect state */
/* Sample state buffer */
- if (mem_select)
- buffer_address = pI915XvMC->ssb.offset;
- else
- buffer_address = pI915XvMC->ssb.bus_addr;
- OUT_BATCH(STATE_VALID | STATE_FORCE | buffer_address);
+ OUT_RELOC(pI915XvMC->ssb_bo, I915_GEM_DOMAIN_INSTRUCTION, 0,
+ STATE_VALID | STATE_FORCE);
OUT_BATCH(7); /* 8 - 1 */
/* Pixel shader program buffer */
@@ -862,14 +862,7 @@ static int i915_xvmc_map_buffers(i915XvMCContext * pI915XvMC)
pI915XvMC->sis.handle,
pI915XvMC->sis.size,
(drmAddress *) & pI915XvMC->sis.map) != 0) {
- return -1;
- }
-
- if (drmMap(xvmc_driver->fd,
- pI915XvMC->ssb.handle,
- pI915XvMC->ssb.size,
- (drmAddress *) & pI915XvMC->ssb.map) != 0) {
- return -1;
+ return 0;
}
if (drmMap(xvmc_driver->fd,
@@ -883,24 +876,24 @@ static int i915_xvmc_map_buffers(i915XvMCContext * pI915XvMC)
pI915XvMC->psp.handle,
pI915XvMC->psp.size,
(drmAddress *) & pI915XvMC->psp.map) != 0) {
- return -1;
+ return 0;
}
if (drmMap(xvmc_driver->fd,
pI915XvMC->psc.handle,
pI915XvMC->psc.size,
(drmAddress *) & pI915XvMC->psc.map) != 0) {
- return -1;
+ return 0;
}
if (drmMap(xvmc_driver->fd,
pI915XvMC->corrdata.handle,
pI915XvMC->corrdata.size,
(drmAddress *) & pI915XvMC->corrdata.map) != 0) {
- return -1;
+ return 0;
}
- return 0;
+ return 1;
}
static void i915_xvmc_unmap_buffers(i915XvMCContext * pI915XvMC)
@@ -910,11 +903,6 @@ static void i915_xvmc_unmap_buffers(i915XvMCContext * pI915XvMC)
pI915XvMC->sis.map = NULL;
}
- if (pI915XvMC->ssb.map) {
- drmUnmap(pI915XvMC->ssb.map, pI915XvMC->ssb.size);
- pI915XvMC->ssb.map = NULL;
- }
-
if (pI915XvMC->msb.map) {
drmUnmap(pI915XvMC->msb.map, pI915XvMC->msb.size);
pI915XvMC->msb.map = NULL;
@@ -936,6 +924,23 @@ static void i915_xvmc_unmap_buffers(i915XvMCContext * pI915XvMC)
}
}
+static int i915_xvmc_alloc_one_time_buffers(i915XvMCContext *pI915XvMC)
+{
+ pI915XvMC->ssb_bo = drm_intel_bo_alloc(xvmc_driver->bufmgr,
+ "ssb",
+ GTT_PAGE_SIZE,
+ GTT_PAGE_SIZE);
+ if (!pI915XvMC->ssb_bo)
+ return 0;
+
+ return 1;
+}
+
+static void i915_xvmc_free_one_time_buffers(i915XvMCContext *pI915XvMC)
+{
+ drm_intel_bo_unreference(pI915XvMC->ssb_bo);
+}
+
/*
* Function: i915_release_resource
*/
@@ -948,6 +953,7 @@ static void i915_release_resource(Display * display, XvMCContext * context)
pI915XvMC->ref--;
i915_xvmc_unmap_buffers(pI915XvMC);
+ i915_xvmc_free_one_time_buffers(pI915XvMC);
free(pI915XvMC);
context->privData = NULL;
@@ -987,9 +993,6 @@ static Status i915_xvmc_mc_create_context(Display * display,
pI915XvMC->sis.handle = tmpComm->sis.handle;
pI915XvMC->sis.offset = tmpComm->sis.offset;
pI915XvMC->sis.size = tmpComm->sis.size;
- pI915XvMC->ssb.handle = tmpComm->ssb.handle;
- pI915XvMC->ssb.offset = tmpComm->ssb.offset;
- pI915XvMC->ssb.size = tmpComm->ssb.size;
pI915XvMC->msb.handle = tmpComm->msb.handle;
pI915XvMC->msb.offset = tmpComm->msb.offset;
pI915XvMC->msb.size = tmpComm->msb.size;
@@ -1003,7 +1006,6 @@ static Status i915_xvmc_mc_create_context(Display * display,
if (pI915XvMC->deviceID == PCI_CHIP_I915_G ||
pI915XvMC->deviceID == PCI_CHIP_I915_GM) {
pI915XvMC->sis.bus_addr = tmpComm->sis.bus_addr;
- pI915XvMC->ssb.bus_addr = tmpComm->ssb.bus_addr;
pI915XvMC->msb.bus_addr = tmpComm->msb.bus_addr;
pI915XvMC->psp.bus_addr = tmpComm->psp.bus_addr;
pI915XvMC->psc.bus_addr = tmpComm->psc.bus_addr;
@@ -1017,12 +1019,11 @@ static Status i915_xvmc_mc_create_context(Display * display,
XFree(priv_data);
priv_data = NULL;
- if (i915_xvmc_map_buffers(pI915XvMC)) {
- i915_xvmc_unmap_buffers(pI915XvMC);
- free(pI915XvMC);
- context->privData = NULL;
- return BadAlloc;
- }
+ if (!i915_xvmc_alloc_one_time_buffers(pI915XvMC))
+ goto free_one_time_buffers;
+
+ if (!i915_xvmc_map_buffers(pI915XvMC))
+ goto unmap_buffers;
/* Initialize private context values */
pI915XvMC->yStride = STRIDE(context->width);
@@ -1041,6 +1042,14 @@ static Status i915_xvmc_mc_create_context(Display * display,
i915_mc_load_indirect_render_init(context);
return Success;
+
+unmap_buffers:
+ i915_xvmc_unmap_buffers(pI915XvMC);
+free_one_time_buffers:
+ i915_xvmc_free_one_time_buffers(pI915XvMC);
+ free(pI915XvMC);
+ context->privData = NULL;
+ return BadAlloc;
}
static int i915_xvmc_mc_destroy_context(Display * display,