mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-10 21:10:16 +01:00
vc4: Keep the validated shader around for the simulator execution.
This more closely matches the kernel behavior on shader validation now.
This commit is contained in:
parent
22954db71c
commit
044f7bbda0
3 changed files with 17 additions and 13 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue