init_buffers(struct vl_compositor *c)
{
struct pipe_vertex_element vertex_elems[3];
+ memset(vertex_elems, 0, sizeof(vertex_elems));
assert(c);
element.src_offset = 0;
element.instance_divisor = 0;
element.vertex_buffer_index = 0;
+ element.dual_slot = false;
element.src_format = PIPE_FORMAT_R32G32_FLOAT;
return element;
state->velem.velems[location].src_offset = vi->pVertexAttributeDescriptions[i].offset;
state->velem.velems[location].vertex_buffer_index = vi->pVertexAttributeDescriptions[i].binding;
state->velem.velems[location].src_format = lvp_vk_format_to_pipe_format(vi->pVertexAttributeDescriptions[i].format);
+ state->velem.velems[location].dual_slot = false;
switch (vi->pVertexBindingDescriptions[vi->pVertexAttributeDescriptions[i].binding].inputRate) {
case VK_VERTEX_INPUT_RATE_VERTEX:
ve.velems[n].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
ve.velems[n].src_offset = 0;
ve.velems[n].instance_divisor = 0;
+ ve.velems[n].dual_slot = false;
}
}
ve.velems[n].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
ve.velems[n].src_offset = 0;
ve.velems[n].instance_divisor = 0;
+ ve.velems[n].dual_slot = false;
}
}
This->elems[i].instance_divisor = 0;
This->elems[i].vertex_buffer_index = This->decls[i].Stream;
This->elems[i].src_format = decltype_format(This->decls[i].Type);
+ This->elems[i].dual_slot = false;
/* XXX Remember Method (tesselation), Usage, UsageIndex */
DBG("VERTEXELEMENT[%u]: Stream=%u Offset=%u Type=%s DeclUsage=%s%d\n", i,
/** Which vertex_buffer (as given to pipe->set_vertex_buffer()) does
* this attribute live in?
*/
- uint8_t vertex_buffer_index;
+ uint8_t vertex_buffer_index:7;
+
+ /**
+ * Whether this element refers to a dual-slot vertex shader input.
+ * The purpose of this field is to do dual-slot lowering when the CSO is
+ * created instead of during every state change.
+ *
+ * It's lowered by util_lower_uint64_vertex_elements.
+ */
+ bool dual_slot:1;
/**
* This has only 8 bits because all vertex formats should be <= 255.
velement->src_format = format;
velement->instance_divisor = instance_divisor;
velement->vertex_buffer_index = vbo_index;
+ velement->dual_slot = false;
assert(velement->src_format);
}
velements[idx].src_format = vformat->_PipeFormat;
velements[idx].instance_divisor = instance_divisor;
velements[idx].vertex_buffer_index = vbo_index;
+ velements[idx].dual_slot = false;
assert(velements[idx].src_format);
return;
}
velems.velems[i].instance_divisor = 0;
velems.velems[i].vertex_buffer_index = 0;
velems.velems[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
+ velems.velems[i].dual_slot = false;
}
velems.count = numAttribs;
velem.velems[0].instance_divisor = 0;
velem.velems[0].vertex_buffer_index = 0;
velem.velems[0].src_format = PIPE_FORMAT_R32G32_FLOAT;
+ velem.velems[0].dual_slot = false;
cso_set_vertex_elements(cso, &velem);