- bo = tex->bo;
-
- /*
- * classic i965 sets render_cache_rw for constant buffers and sol
- * surfaces but not render buffers. Why?
- */
- gen7_fill_normal_SURFACE_STATE(dev, tex, surface->format,
- surface->u.tex.level, 1,
- surface->u.tex.first_layer,
- surface->u.tex.last_layer - surface->u.tex.first_layer + 1,
- true, true, dw, Elements(dw));
- }
- else {
- bo = NULL;
- gen7_fill_null_SURFACE_STATE(dev,
- surface->width, surface->height, 1, 0, dw, Elements(dw));
- }
-
- return gen7_emit_SURFACE_STATE(dev, bo, true, dw, Elements(dw), cp);
-}
-
-static uint32_t
-gen7_emit_view_SURFACE_STATE(const struct ilo_dev_info *dev,
- const struct pipe_sampler_view *view,
- struct ilo_cp *cp)
-{
- struct ilo_texture *tex = ilo_texture(view->texture);
- uint32_t dw[8];
-
- ILO_GPE_VALID_GEN(dev, 7, 7);
-
- gen7_fill_normal_SURFACE_STATE(dev, tex, view->format,
- view->u.tex.first_level,
- view->u.tex.last_level - view->u.tex.first_level + 1,
- view->u.tex.first_layer,
- view->u.tex.last_layer - view->u.tex.first_layer + 1,
- false, false, dw, Elements(dw));
-
- return gen7_emit_SURFACE_STATE(dev, tex->bo, false, dw, Elements(dw), cp);
-}
-
-static uint32_t
-gen7_emit_cbuf_SURFACE_STATE(const struct ilo_dev_info *dev,
- const struct pipe_constant_buffer *cbuf,
- struct ilo_cp *cp)
-{
- const enum pipe_format elem_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
- struct ilo_buffer *buf = ilo_buffer(cbuf->buffer);
- uint32_t dw[8];
-
- ILO_GPE_VALID_GEN(dev, 7, 7);
-
- gen7_fill_buffer_SURFACE_STATE(dev, buf,
- cbuf->buffer_offset, cbuf->buffer_size,
- util_format_get_blocksize(elem_format), elem_format,
- false, false, dw, Elements(dw));
-
- return gen7_emit_SURFACE_STATE(dev, buf->bo, false, dw, Elements(dw), cp);
-}
-
-static uint32_t
-gen7_emit_SAMPLER_BORDER_COLOR_STATE(const struct ilo_dev_info *dev,
- const union pipe_color_union *color,
- struct ilo_cp *cp)
-{
- const int state_align = 32 / 4;
- const int state_len = 4;
- uint32_t state_offset, *dw;
-
- ILO_GPE_VALID_GEN(dev, 7, 7);
-
- dw = ilo_cp_steal_ptr(cp, "SAMPLER_BORDER_COLOR_STATE",
- state_len, state_align, &state_offset);
- memcpy(dw, color->f, 4 * 4);
-
- return state_offset;
-}
-
-static int
-gen7_estimate_command_size(const struct ilo_dev_info *dev,
- enum ilo_gpe_gen7_command cmd,
- int arg)
-{
- static const struct {
- int header;
- int body;
- } gen7_command_size_table[ILO_GPE_GEN7_COMMAND_COUNT] = {
- [ILO_GPE_GEN7_STATE_BASE_ADDRESS] = { 0, 10 },
- [ILO_GPE_GEN7_STATE_SIP] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_VF_STATISTICS] = { 0, 1 },
- [ILO_GPE_GEN7_PIPELINE_SELECT] = { 0, 1 },
- [ILO_GPE_GEN7_MEDIA_VFE_STATE] = { 0, 8 },
- [ILO_GPE_GEN7_MEDIA_CURBE_LOAD] = { 0, 4 },
- [ILO_GPE_GEN7_MEDIA_INTERFACE_DESCRIPTOR_LOAD] = { 0, 4 },
- [ILO_GPE_GEN7_MEDIA_STATE_FLUSH] = { 0, 2 },
- [ILO_GPE_GEN7_GPGPU_WALKER] = { 0, 11 },
- [ILO_GPE_GEN7_3DSTATE_CLEAR_PARAMS] = { 0, 3 },
- [ILO_GPE_GEN7_3DSTATE_DEPTH_BUFFER] = { 0, 7 },
- [ILO_GPE_GEN7_3DSTATE_STENCIL_BUFFER] = { 0, 3 },
- [ILO_GPE_GEN7_3DSTATE_HIER_DEPTH_BUFFER] = { 0, 3 },
- [ILO_GPE_GEN7_3DSTATE_VERTEX_BUFFERS] = { 1, 4 },
- [ILO_GPE_GEN7_3DSTATE_VERTEX_ELEMENTS] = { 1, 2 },
- [ILO_GPE_GEN7_3DSTATE_INDEX_BUFFER] = { 0, 3 },
- [ILO_GPE_GEN7_3DSTATE_CC_STATE_POINTERS] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_SCISSOR_STATE_POINTERS] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_VS] = { 0, 6 },
- [ILO_GPE_GEN7_3DSTATE_GS] = { 0, 7 },
- [ILO_GPE_GEN7_3DSTATE_CLIP] = { 0, 4 },
- [ILO_GPE_GEN7_3DSTATE_SF] = { 0, 7 },
- [ILO_GPE_GEN7_3DSTATE_WM] = { 0, 3 },
- [ILO_GPE_GEN7_3DSTATE_CONSTANT_VS] = { 0, 7 },
- [ILO_GPE_GEN7_3DSTATE_CONSTANT_GS] = { 0, 7 },
- [ILO_GPE_GEN7_3DSTATE_CONSTANT_PS] = { 0, 7 },
- [ILO_GPE_GEN7_3DSTATE_SAMPLE_MASK] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_CONSTANT_HS] = { 0, 7 },
- [ILO_GPE_GEN7_3DSTATE_CONSTANT_DS] = { 0, 7 },
- [ILO_GPE_GEN7_3DSTATE_HS] = { 0, 7 },
- [ILO_GPE_GEN7_3DSTATE_TE] = { 0, 4 },
- [ILO_GPE_GEN7_3DSTATE_DS] = { 0, 6 },
- [ILO_GPE_GEN7_3DSTATE_STREAMOUT] = { 0, 3 },
- [ILO_GPE_GEN7_3DSTATE_SBE] = { 0, 14 },
- [ILO_GPE_GEN7_3DSTATE_PS] = { 0, 8 },
- [ILO_GPE_GEN7_3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_VIEWPORT_STATE_POINTERS_CC] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_BLEND_STATE_POINTERS] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_DEPTH_STENCIL_STATE_POINTERS] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_BINDING_TABLE_POINTERS_VS] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_BINDING_TABLE_POINTERS_HS] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_BINDING_TABLE_POINTERS_DS] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_BINDING_TABLE_POINTERS_GS] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_BINDING_TABLE_POINTERS_PS] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_SAMPLER_STATE_POINTERS_VS] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_SAMPLER_STATE_POINTERS_HS] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_SAMPLER_STATE_POINTERS_DS] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_SAMPLER_STATE_POINTERS_GS] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_SAMPLER_STATE_POINTERS_PS] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_URB_VS] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_URB_HS] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_URB_DS] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_URB_GS] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_DRAWING_RECTANGLE] = { 0, 4 },
- [ILO_GPE_GEN7_3DSTATE_POLY_STIPPLE_OFFSET] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_POLY_STIPPLE_PATTERN] = { 0, 33, },
- [ILO_GPE_GEN7_3DSTATE_LINE_STIPPLE] = { 0, 3 },
- [ILO_GPE_GEN7_3DSTATE_AA_LINE_PARAMETERS] = { 0, 3 },
- [ILO_GPE_GEN7_3DSTATE_MULTISAMPLE] = { 0, 4 },
- [ILO_GPE_GEN7_3DSTATE_PUSH_CONSTANT_ALLOC_VS] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_PUSH_CONSTANT_ALLOC_HS] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_PUSH_CONSTANT_ALLOC_DS] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_PUSH_CONSTANT_ALLOC_GS] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_PUSH_CONSTANT_ALLOC_PS] = { 0, 2 },
- [ILO_GPE_GEN7_3DSTATE_SO_DECL_LIST] = { 3, 2 },
- [ILO_GPE_GEN7_3DSTATE_SO_BUFFER] = { 0, 4 },
- [ILO_GPE_GEN7_PIPE_CONTROL] = { 0, 5 },
- [ILO_GPE_GEN7_3DPRIMITIVE] = { 0, 7 },
- };
- const int header = gen7_command_size_table[cmd].header;
- const int body = gen7_command_size_table[cmd].body;
- const int count = arg;
-
- ILO_GPE_VALID_GEN(dev, 7, 7);
- assert(cmd < ILO_GPE_GEN7_COMMAND_COUNT);
-
- return (likely(count)) ? header + body * count : 0;
-}
-
-static int
-gen7_estimate_state_size(const struct ilo_dev_info *dev,
- enum ilo_gpe_gen7_state state,
- int arg)
-{
- static const struct {
- int alignment;
- int body;
- bool is_array;
- } gen7_state_size_table[ILO_GPE_GEN7_STATE_COUNT] = {
- [ILO_GPE_GEN7_INTERFACE_DESCRIPTOR_DATA] = { 8, 8, true },
- [ILO_GPE_GEN7_SF_CLIP_VIEWPORT] = { 16, 16, true },
- [ILO_GPE_GEN7_CC_VIEWPORT] = { 8, 2, true },
- [ILO_GPE_GEN7_COLOR_CALC_STATE] = { 16, 6, false },
- [ILO_GPE_GEN7_BLEND_STATE] = { 16, 2, true },
- [ILO_GPE_GEN7_DEPTH_STENCIL_STATE] = { 16, 3, false },
- [ILO_GPE_GEN7_SCISSOR_RECT] = { 8, 2, true },
- [ILO_GPE_GEN7_BINDING_TABLE_STATE] = { 8, 1, true },
- [ILO_GPE_GEN7_SURFACE_STATE] = { 8, 8, false },
- [ILO_GPE_GEN7_SAMPLER_STATE] = { 8, 4, true },
- [ILO_GPE_GEN7_SAMPLER_BORDER_COLOR_STATE] = { 8, 4, false },
- [ILO_GPE_GEN7_PUSH_CONSTANT_BUFFER] = { 8, 1, true },
- };
- const int alignment = gen7_state_size_table[state].alignment;
- const int body = gen7_state_size_table[state].body;
- const bool is_array = gen7_state_size_table[state].is_array;
- const int count = arg;
- int estimate;
-
- ILO_GPE_VALID_GEN(dev, 7, 7);
- assert(state < ILO_GPE_GEN7_STATE_COUNT);
-
- if (likely(count)) {
- if (is_array) {
- estimate = (alignment - 1) + body * count;
- }
- else {
- estimate = (alignment - 1) + body;
- /* all states are aligned */
- if (count > 1)
- estimate += util_align_npot(body, alignment) * (count - 1);
- }
- }
- else {
- estimate = 0;