drm/i915/bdw: Render state init for Execlists
[deliverable/linux.git] / drivers / gpu / drm / i915 / i915_gem_render_state.c
index e60be3f552a6b1aed14770bef853a1eab2ddf5aa..a9a62d75aa577daa015543c7955c25cd5bf5b42a 100644 (file)
 #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)
 {
@@ -127,30 +120,47 @@ static int render_state_setup(struct render_state *so)
        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,
@@ -164,6 +174,6 @@ int i915_gem_render_state_init(struct intel_engine_cs *ring)
        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;
 }
This page took 0.146326 seconds and 5 git commands to generate.