From 044f7bbda077ea7029fb1004183b29127307bd84 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Tue, 28 Jul 2015 10:11:08 -0700 Subject: [PATCH] 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 ++++++++++ .../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 321e8115f8f..49bb64838ea 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 b58013dd2ee..4097dce28a7 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 2bb36b253bb..68ace0216aa 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; }; -- 2.30.2