void si_pm4_upload_indirect_buffer(struct si_context *sctx, struct si_pm4_state *state) { struct pipe_screen *screen = sctx->b.b.screen; unsigned aligned_ndw = align(state->ndw, 8); /* only supported on CIK and later */ if (sctx->b.chip_class < CIK) return; assert(state->ndw); assert(aligned_ndw <= SI_PM4_MAX_DW); r600_resource_reference(&state->indirect_buffer, NULL); /* TODO: this hangs with 1024 or higher alignment on GFX9. */ state->indirect_buffer = (struct r600_resource*) si_aligned_buffer_create(screen, 0, PIPE_USAGE_DEFAULT, aligned_ndw * 4, 256); if (!state->indirect_buffer) return; /* Pad the IB to 8 DWs to meet CP fetch alignment requirements. */ if (sctx->screen->info.gfx_ib_pad_with_type2) { for (int i = state->ndw; i < aligned_ndw; i++) state->pm4[i] = 0x80000000; /* type2 nop packet */ } else { for (int i = state->ndw; i < aligned_ndw; i++) state->pm4[i] = 0xffff1000; /* type3 nop packet */ } pipe_buffer_write(&sctx->b.b, &state->indirect_buffer->b.b, 0, aligned_ndw *4, state->pm4); }
static void si_alloc_separate_cmask(struct si_screen *sscreen, struct si_texture *tex) { if (tex->cmask_buffer || !tex->surface.cmask_size) return; tex->cmask_buffer = si_aligned_buffer_create(&sscreen->b, SI_RESOURCE_FLAG_UNMAPPABLE, PIPE_USAGE_DEFAULT, tex->surface.cmask_size, tex->surface.cmask_alignment); if (tex->cmask_buffer == NULL) return; tex->cmask_base_address_reg = tex->cmask_buffer->gpu_address >> 8; tex->cb_color_info |= S_028C70_FAST_CLEAR(1); p_atomic_inc(&sscreen->compressed_colortex_counter); }