28,13 → 28,6 |
#include "i915_drv.h" |
#include "intel_renderstate.h" |
|
struct render_state { |
const struct intel_renderstate_rodata *rodata; |
struct drm_i915_gem_object *obj; |
u64 ggtt_offset; |
int gen; |
}; |
|
static const struct intel_renderstate_rodata * |
render_state_get_rodata(struct drm_device *dev, const int gen) |
{ |
45,6 → 38,8 |
return &gen7_null_state; |
case 8: |
return &gen8_null_state; |
case 9: |
return &gen9_null_state; |
} |
|
return NULL; |
113,7 → 108,7 |
|
d[i++] = s; |
} |
FreeKernelSpace(d); |
kunmap(page); |
|
ret = i915_gem_object_set_to_gtt_domain(so->obj, false); |
if (ret) |
127,31 → 122,48 |
return 0; |
} |
|
static void render_state_fini(struct render_state *so) |
void i915_gem_render_state_fini(struct render_state *so) |
{ |
i915_gem_object_ggtt_unpin(so->obj); |
drm_gem_object_unreference(&so->obj->base); |
} |
|
int i915_gem_render_state_init(struct intel_engine_cs *ring) |
int i915_gem_render_state_prepare(struct intel_engine_cs *ring, |
struct render_state *so) |
{ |
struct render_state so; |
int ret; |
|
if (WARN_ON(ring->id != RCS)) |
return -ENOENT; |
|
ret = render_state_init(&so, ring->dev); |
ret = render_state_init(so, ring->dev); |
if (ret) |
return ret; |
|
if (so.rodata == NULL) |
if (so->rodata == NULL) |
return 0; |
|
ret = render_state_setup(&so); |
ret = render_state_setup(so); |
if (ret) { |
i915_gem_render_state_fini(so); |
return ret; |
} |
|
return 0; |
} |
|
int i915_gem_render_state_init(struct intel_engine_cs *ring) |
{ |
struct render_state so; |
int ret; |
|
ret = i915_gem_render_state_prepare(ring, &so); |
if (ret) |
goto out; |
return ret; |
|
if (so.rodata == NULL) |
return 0; |
|
ret = ring->dispatch_execbuffer(ring, |
so.ggtt_offset, |
so.rodata->batch_items * 4, |
164,6 → 176,6 |
ret = __i915_add_request(ring, NULL, so.obj, NULL); |
/* __i915_add_request moves object to inactive if it fails */ |
out: |
render_state_fini(&so); |
i915_gem_render_state_fini(&so); |
return ret; |
} |