void *unvalidated,
uint32_t len,
bool is_bin,
+ bool has_bin,
struct vc4_exec_info *exec)
{
uint32_t dst_offset = 0;
if (is_bin) {
exec->ct0ea = exec->ct0ca + dst_offset;
- if (!exec->found_start_tile_binning_packet) {
+ if (has_bin && !exec->found_start_tile_binning_packet) {
DRM_ERROR("Bin CL missing VC4_PACKET_START_TILE_BINNING\n");
return -EINVAL;
}
* increment from the bin CL. Otherwise a later submit would
* have render execute immediately.
*/
- if (!exec->found_wait_on_semaphore_packet) {
- DRM_ERROR("Render CL missing VC4_PACKET_WAIT_ON_SEMAPHORE\n");
+ if (exec->found_wait_on_semaphore_packet != has_bin) {
+ DRM_ERROR("Render CL %s VC4_PACKET_WAIT_ON_SEMAPHORE\n",
+ exec->found_wait_on_semaphore_packet ?
+ "has" : "missing");
return -EINVAL;
}
exec->ct1ea = exec->ct1ca + dst_offset;
if (ret)
return ret;
- int bfc = simpenrose_do_binning(exec.ct0ca, exec.ct0ea);
- if (bfc != 1) {
- fprintf(stderr, "Binning returned %d flushes, should be 1.\n",
- bfc);
- fprintf(stderr, "Relocated binning command list:\n");
- vc4_dump_cl(screen->simulator_mem_base + exec.ct0ca,
- exec.ct0ea - exec.ct0ca, false);
- abort();
+ if (exec.ct0ca != exec.ct0ea) {
+ int bfc = simpenrose_do_binning(exec.ct0ca, exec.ct0ea);
+ if (bfc != 1) {
+ fprintf(stderr, "Binning returned %d flushes, should be 1.\n",
+ bfc);
+ fprintf(stderr, "Relocated binning command list:\n");
+ vc4_dump_cl(screen->simulator_mem_base + exec.ct0ca,
+ exec.ct0ea - exec.ct0ca, false);
+ abort();
+ }
}
int rfc = simpenrose_do_rendering(exec.ct1ca, exec.ct1ea);
if (rfc != 1) {