*/
#include "genhw/genhw.h"
+#include "core/ilo_builder_mi.h"
+#include "core/ilo_builder_blt.h"
#include "util/u_pack_color.h"
-#include "ilo_3d.h"
-#include "ilo_builder_mi.h"
-#include "ilo_builder_blt.h"
#include "ilo_context.h"
#include "ilo_cp.h"
#include "ilo_blit.h"
static uint32_t
ilo_blitter_blt_begin(struct ilo_blitter *blitter, int max_cmd_size,
- struct intel_bo *dst, enum intel_tiling_mode dst_tiling,
- struct intel_bo *src, enum intel_tiling_mode src_tiling)
+ struct intel_bo *dst,
+ enum gen_surface_tiling dst_tiling,
+ struct intel_bo *src,
+ enum gen_surface_tiling src_tiling)
{
- struct ilo_context *ilo = blitter->ilo;
+ struct ilo_cp *cp = blitter->ilo->cp;
struct intel_bo *aper_check[2];
int count;
uint32_t swctrl;
/* change owner */
- ilo_cp_set_owner(ilo->cp, INTEL_RING_BLT, NULL);
+ ilo_cp_set_owner(cp, INTEL_RING_BLT, NULL);
/* check aperture space */
aper_check[0] = dst;
count++;
}
- if (!ilo_builder_validate(&ilo->cp->builder, count, aper_check))
- ilo_cp_submit(ilo->cp, "out of aperture");
+ if (!ilo_builder_validate(&cp->builder, count, aper_check))
+ ilo_cp_submit(cp, "out of aperture");
/* set BCS_SWCTRL */
swctrl = 0x0;
- if (dst_tiling == INTEL_TILING_Y) {
+ assert(dst_tiling == GEN6_TILING_NONE ||
+ dst_tiling == GEN6_TILING_X ||
+ dst_tiling == GEN6_TILING_Y);
+ assert(src_tiling == GEN6_TILING_NONE ||
+ src_tiling == GEN6_TILING_X ||
+ src_tiling == GEN6_TILING_Y);
+
+ if (dst_tiling == GEN6_TILING_Y) {
swctrl |= GEN6_REG_BCS_SWCTRL_DST_TILING_Y << 16 |
GEN6_REG_BCS_SWCTRL_DST_TILING_Y;
}
- if (src && src_tiling == INTEL_TILING_Y) {
+ if (src && src_tiling == GEN6_TILING_Y) {
swctrl |= GEN6_REG_BCS_SWCTRL_SRC_TILING_Y << 16 |
GEN6_REG_BCS_SWCTRL_SRC_TILING_Y;
}
if (swctrl)
max_cmd_size += (4 + 3) * 2;
- if (ilo_cp_space(ilo->cp) < max_cmd_size) {
- ilo_cp_submit(ilo->cp, "out of space");
- assert(ilo_cp_space(ilo->cp) >= max_cmd_size);
+ if (ilo_cp_space(cp) < max_cmd_size) {
+ ilo_cp_submit(cp, "out of space");
+ assert(ilo_cp_space(cp) >= max_cmd_size);
}
if (swctrl) {
* "SW is required to flush the HW before changing the polarity of
* this bit (Tile Y Destination/Source)."
*/
- gen6_MI_FLUSH_DW(&ilo->cp->builder);
- gen6_MI_LOAD_REGISTER_IMM(&ilo->cp->builder,
- GEN6_REG_BCS_SWCTRL, swctrl);
+ gen6_MI_FLUSH_DW(&cp->builder);
+ gen6_MI_LOAD_REGISTER_IMM(&cp->builder, GEN6_REG_BCS_SWCTRL, swctrl);
swctrl &= ~(GEN6_REG_BCS_SWCTRL_DST_TILING_Y |
GEN6_REG_BCS_SWCTRL_SRC_TILING_Y);
static void
ilo_blitter_blt_end(struct ilo_blitter *blitter, uint32_t swctrl)
{
- struct ilo_context *ilo = blitter->ilo;
+ struct ilo_builder *builder = &blitter->ilo->cp->builder;
/* set BCS_SWCTRL back */
if (swctrl) {
- gen6_MI_FLUSH_DW(&ilo->cp->builder);
- gen6_MI_LOAD_REGISTER_IMM(&ilo->cp->builder, GEN6_REG_BCS_SWCTRL, swctrl);
+ gen6_MI_FLUSH_DW(builder);
+ gen6_MI_LOAD_REGISTER_IMM(builder, GEN6_REG_BCS_SWCTRL, swctrl);
}
}
static bool
buf_clear_region(struct ilo_blitter *blitter,
- struct ilo_buffer *buf, unsigned offset,
+ struct ilo_buffer_resource *buf, unsigned offset,
uint32_t val, unsigned size,
enum gen6_blt_mask value_mask,
enum gen6_blt_mask write_mask)
{
const uint8_t rop = 0xf0; /* PATCOPY */
const int cpp = gen6_blt_translate_value_cpp(value_mask);
- struct ilo_context *ilo = blitter->ilo;
+ struct ilo_builder *builder = &blitter->ilo->cp->builder;
struct gen6_blt_bo dst;
if (offset % cpp || size % cpp)
return false;
- dst.bo = buf->bo;
- dst.offset = offset;
+ dst.bo = buf->vma.bo;
+ dst.offset = buf->vma.bo_offset + offset;
ilo_blitter_blt_begin(blitter, GEN6_COLOR_BLT__SIZE *
(1 + size / 32764 / gen6_blt_max_scanlines),
- dst.bo, INTEL_TILING_NONE, NULL, INTEL_TILING_NONE);
+ dst.bo, GEN6_TILING_NONE, NULL, GEN6_TILING_NONE);
while (size) {
unsigned width, height;
dst.pitch = 0;
}
- gen6_COLOR_BLT(&ilo->cp->builder, &dst, val,
+ gen6_COLOR_BLT(builder, &dst, val,
width, height, rop, value_mask, write_mask);
dst.offset += dst.pitch * height;
static bool
buf_copy_region(struct ilo_blitter *blitter,
- struct ilo_buffer *dst_buf, unsigned dst_offset,
- struct ilo_buffer *src_buf, unsigned src_offset,
+ struct ilo_buffer_resource *dst_buf, unsigned dst_offset,
+ struct ilo_buffer_resource *src_buf, unsigned src_offset,
unsigned size)
{
const uint8_t rop = 0xcc; /* SRCCOPY */
- struct ilo_context *ilo = blitter->ilo;
+ struct ilo_builder *builder = &blitter->ilo->cp->builder;
struct gen6_blt_bo dst, src;
- dst.bo = dst_buf->bo;
- dst.offset = dst_offset;
+ dst.bo = dst_buf->vma.bo;
+ dst.offset = dst_buf->vma.bo_offset + dst_offset;
dst.pitch = 0;
- src.bo = src_buf->bo;
- src.offset = src_offset;
+ src.bo = src_buf->vma.bo;
+ src.offset = src_buf->vma.bo_offset + src_offset;
src.pitch = 0;
ilo_blitter_blt_begin(blitter, GEN6_SRC_COPY_BLT__SIZE *
(1 + size / 32764 / gen6_blt_max_scanlines),
- dst_buf->bo, INTEL_TILING_NONE, src_buf->bo, INTEL_TILING_NONE);
+ dst_buf->vma.bo, GEN6_TILING_NONE,
+ src_buf->vma.bo, GEN6_TILING_NONE);
while (size) {
unsigned width, height;
src.pitch = 0;
}
- gen6_SRC_COPY_BLT(&ilo->cp->builder, &dst, &src,
+ gen6_SRC_COPY_BLT(builder, &dst, &src,
width, height, rop, GEN6_BLT_MASK_8, GEN6_BLT_MASK_8);
dst.offset += dst.pitch * height;
const int cpp = gen6_blt_translate_value_cpp(value_mask);
const unsigned max_extent = 32767; /* INT16_MAX */
const uint8_t rop = 0xf0; /* PATCOPY */
- struct ilo_context *ilo = blitter->ilo;
+ struct ilo_builder *builder = &blitter->ilo->cp->builder;
struct gen6_blt_xy_bo dst;
uint32_t swctrl;
int slice;
- /* no W-tiling support */
- if (dst_tex->separate_s8)
+ /* no W-tiling nor separate stencil support */
+ if (dst_tex->image.tiling == GEN8_TILING_W || dst_tex->separate_s8)
return false;
- if (dst_tex->layout.bo_stride > max_extent)
+ if (dst_tex->image.bo_stride > max_extent)
return false;
if (dst_box->width * cpp > gen6_blt_max_bytes_per_scanline)
return false;
- dst.bo = dst_tex->bo;
- dst.offset = 0;
- dst.pitch = dst_tex->layout.bo_stride;
- dst.tiling = dst_tex->layout.tiling;
+ dst.bo = dst_tex->vma.bo;
+ dst.offset = dst_tex->vma.bo_offset;
+ dst.pitch = dst_tex->image.bo_stride;
+ dst.tiling = dst_tex->image.tiling;
swctrl = ilo_blitter_blt_begin(blitter,
GEN6_XY_COLOR_BLT__SIZE * dst_box->depth,
- dst_tex->bo, dst_tex->layout.tiling, NULL, INTEL_TILING_NONE);
+ dst_tex->vma.bo, dst_tex->image.tiling, NULL, GEN6_TILING_NONE);
for (slice = 0; slice < dst_box->depth; slice++) {
unsigned x, y;
- ilo_layout_get_slice_pos(&dst_tex->layout,
+ ilo_image_get_slice_pos(&dst_tex->image,
dst_level, dst_box->z + slice, &x, &y);
dst.x = x + dst_box->x;
dst.y + dst_box->height > max_extent)
break;
- gen6_XY_COLOR_BLT(&ilo->cp->builder, &dst, val,
+ gen6_XY_COLOR_BLT(builder, &dst, val,
dst_box->width, dst_box->height, rop, value_mask, write_mask);
}
const struct pipe_box *src_box)
{
const struct util_format_description *desc =
- util_format_description(dst_tex->layout.format);
+ util_format_description(dst_tex->image_format);
const unsigned max_extent = 32767; /* INT16_MAX */
const uint8_t rop = 0xcc; /* SRCCOPY */
- struct ilo_context *ilo = blitter->ilo;
+ struct ilo_builder *builder = &blitter->ilo->cp->builder;
enum gen6_blt_mask mask;
struct gen6_blt_xy_bo dst, src;
uint32_t swctrl;
int cpp, xscale, slice;
- /* no W-tiling support */
- if (dst_tex->separate_s8 || src_tex->separate_s8)
+ /* no W-tiling nor separate stencil support */
+ if (dst_tex->image.tiling == GEN8_TILING_W || dst_tex->separate_s8 ||
+ src_tex->image.tiling == GEN8_TILING_W || src_tex->separate_s8)
return false;
- if (dst_tex->layout.bo_stride > max_extent ||
- src_tex->layout.bo_stride > max_extent)
+ if (dst_tex->image.bo_stride > max_extent ||
+ src_tex->image.bo_stride > max_extent)
return false;
cpp = desc->block.bits / 8;
break;
}
- dst.bo = dst_tex->bo;
- dst.offset = 0;
- dst.pitch = dst_tex->layout.bo_stride;
- dst.tiling = dst_tex->layout.tiling;
+ dst.bo = dst_tex->vma.bo;
+ dst.offset = dst_tex->vma.bo_offset;
+ dst.pitch = dst_tex->image.bo_stride;
+ dst.tiling = dst_tex->image.tiling;
- src.bo = src_tex->bo;
- src.offset = 0;
- src.pitch = src_tex->layout.bo_stride;
- src.tiling = src_tex->layout.tiling;
+ src.bo = src_tex->vma.bo;
+ src.offset = src_tex->vma.bo_offset;
+ src.pitch = src_tex->image.bo_stride;
+ src.tiling = src_tex->image.tiling;
swctrl = ilo_blitter_blt_begin(blitter,
GEN6_XY_SRC_COPY_BLT__SIZE * src_box->depth,
for (slice = 0; slice < src_box->depth; slice++) {
unsigned dx, dy, sx, sy, width, height;
- ilo_layout_get_slice_pos(&dst_tex->layout,
+ ilo_image_get_slice_pos(&dst_tex->image,
dst_level, dst_z + slice, &dx, &dy);
- ilo_layout_get_slice_pos(&src_tex->layout,
+ ilo_image_get_slice_pos(&src_tex->image,
src_level, src_box->z + slice, &sx, &sy);
dst.x = (dx + dst_x) * xscale;
dst.x + width > max_extent || dst.y + height > max_extent)
break;
- gen6_XY_SRC_COPY_BLT(&ilo->cp->builder, &dst, &src,
+ gen6_XY_SRC_COPY_BLT(builder, &dst, &src,
width, height, rop, mask, mask);
}
src_box->height == 1 &&
src_box->depth == 1);
- success = buf_copy_region(blitter,
- ilo_buffer(dst), dst_offset, ilo_buffer(src), src_offset, size);
+ success = buf_copy_region(blitter, ilo_buffer_resource(dst), dst_offset,
+ ilo_buffer_resource(src), src_offset, size);
}
else if (dst->target != PIPE_BUFFER && src->target != PIPE_BUFFER) {
success = tex_copy_region(blitter,
union util_color packed;
bool success;
- if (!ilo_3d_pass_render_condition(blitter->ilo))
+ if (ilo_skip_rendering(blitter->ilo))
return true;
switch (cpp) {
if (offset + size > end)
size = end - offset;
- success = buf_clear_region(blitter, ilo_buffer(rt->texture),
+ success = buf_clear_region(blitter, ilo_buffer_resource(rt->texture),
offset, packed.ui[0], size, mask, mask);
}
else {
struct pipe_box box;
uint32_t val;
- if (!ilo_3d_pass_render_condition(blitter->ilo))
+ if (ilo_skip_rendering(blitter->ilo))
return true;
switch (zs->format) {