Mesa (master): vc4: Keep the validated shader around for the simulator execution.

Eric Anholt anholt at kemper.freedesktop.org
Wed Jul 29 03:03:35 UTC 2015


Module: Mesa
Branch: master
Commit: 044f7bbda077ea7029fb1004183b29127307bd84
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=044f7bbda077ea7029fb1004183b29127307bd84

Author: Eric Anholt <eric at anholt.net>
Date:   Tue Jul 28 10:11:08 2015 -0700

vc4: Keep the validated shader around for the simulator execution.

This more closely matches the kernel behavior on shader validation now.

---

 src/gallium/drivers/vc4/kernel/vc4_validate.c    |   19 ++++++-------------
 src/gallium/drivers/vc4/vc4_simulator.c          |   10 ++++++++++
 src/gallium/drivers/vc4/vc4_simulator_validate.h |    1 +
 3 files changed, 17 insertions(+), 13 deletions(-)

diff --git a/src/gallium/drivers/vc4/kernel/vc4_validate.c b/src/gallium/drivers/vc4/kernel/vc4_validate.c
index 321e811..49bb648 100644
--- a/src/gallium/drivers/vc4/kernel/vc4_validate.c
+++ b/src/gallium/drivers/vc4/kernel/vc4_validate.c
@@ -750,7 +750,6 @@ validate_gl_shader_rec(struct drm_device *dev,
 	struct drm_gem_cma_object *bo[shader_reloc_count + 8];
 	uint32_t nr_attributes, nr_relocs, packet_size;
 	int i;
-	struct vc4_validated_shader_info *validated_shader = NULL;
 
 	nr_attributes = state->addr & 0x7;
 	if (nr_attributes == 0)
@@ -799,6 +798,7 @@ validate_gl_shader_rec(struct drm_device *dev,
 	}
 
 	for (i = 0; i < shader_reloc_count; i++) {
+		struct vc4_validated_shader_info *validated_shader;
 		uint32_t o = shader_reloc_offsets[i];
 		uint32_t src_offset = *(uint32_t *)(pkt_u + o);
 		uint32_t *texture_handles_u;
@@ -810,18 +810,17 @@ validate_gl_shader_rec(struct drm_device *dev,
 		if (src_offset != 0) {
 			DRM_ERROR("Shaders must be at offset 0 of "
 				  "the BO.\n");
-			goto fail;
+			return -EINVAL;
 		}
 
-		kfree(validated_shader);
-		validated_shader = vc4_validate_shader(bo[i]);
+		validated_shader = to_vc4_bo(&bo[i]->base)->validated_shader;
 		if (!validated_shader)
-			goto fail;
+			return -EINVAL;
 
 		if (validated_shader->uniforms_src_size >
 		    exec->uniforms_size) {
 			DRM_ERROR("Uniforms src buffer overflow\n");
-			goto fail;
+			return -EINVAL;
 		}
 
 		texture_handles_u = exec->uniforms_u;
@@ -838,7 +837,7 @@ validate_gl_shader_rec(struct drm_device *dev,
 				       uniform_data_u,
 				       &validated_shader->texture_samples[tex],
 				       texture_handles_u[tex])) {
-				goto fail;
+				return -EINVAL;
 			}
 		}
 
@@ -881,13 +880,7 @@ validate_gl_shader_rec(struct drm_device *dev,
 		*(uint32_t *)(pkt_v + o) = vbo->paddr + offset;
 	}
 
-	kfree(validated_shader);
-
 	return 0;
-
-fail:
-	kfree(validated_shader);
-	return -EINVAL;
 }
 
 int
diff --git a/src/gallium/drivers/vc4/vc4_simulator.c b/src/gallium/drivers/vc4/vc4_simulator.c
index b58013d..4097dce 100644
--- a/src/gallium/drivers/vc4/vc4_simulator.c
+++ b/src/gallium/drivers/vc4/vc4_simulator.c
@@ -79,6 +79,7 @@ vc4_simulator_pin_bos(struct drm_device *dev, struct vc4_exec_info *exec)
                 struct vc4_bo *bo = bos[i];
                 struct drm_gem_cma_object *obj = vc4_wrap_bo_with_cma(dev, bo);
 
+                struct drm_vc4_bo *drm_bo = to_vc4_bo(&obj->base);
 #if 0
                 fprintf(stderr, "bo hindex %d: %s\n", i, bo->name);
 #endif
@@ -87,6 +88,15 @@ vc4_simulator_pin_bos(struct drm_device *dev, struct vc4_exec_info *exec)
                 memcpy(obj->vaddr, bo->map, bo->size);
 
                 exec->bo[i].bo = obj;
+
+                /* The kernel does this validation at shader create ioctl
+                 * time.
+                 */
+                if (strcmp(bo->name, "code") == 0) {
+                        drm_bo->validated_shader = vc4_validate_shader(obj);
+                        if (!drm_bo->validated_shader)
+                                abort();
+                }
         }
         return 0;
 }
diff --git a/src/gallium/drivers/vc4/vc4_simulator_validate.h b/src/gallium/drivers/vc4/vc4_simulator_validate.h
index 2bb36b2..68ace02 100644
--- a/src/gallium/drivers/vc4/vc4_simulator_validate.h
+++ b/src/gallium/drivers/vc4/vc4_simulator_validate.h
@@ -78,6 +78,7 @@ struct drm_gem_cma_object {
 struct drm_vc4_bo {
         struct drm_gem_cma_object base;
         struct vc4_bo *bo;
+        struct vc4_validated_shader_info *validated_shader;
         struct list_head unref_head;
 };
 




More information about the mesa-commit mailing list