summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErik Faye-Lund <erik.faye-lund@collabora.com>2019-03-06 13:28:51 +0100
committerErik Faye-Lund <erik.faye-lund@collabora.com>2019-04-29 10:28:38 +0000
commitef13691e0c07d909a4f14280ca4fefbd79a9865b (patch)
tree784630d6eb769603a6592efd05dc0c0b4dfa8290
parent04b0c6e9df718ff0f4d9f74c2a7142de44b0eb97 (diff)
swr: support NULL-resources
It's legal for a buffer-object to have a NULL-resource, but let's just skip over it, as there's nothing to do. This patch switches the order of the conditionals in swr_update_derived, so the logic becomes a bit more straight forward: if (is_user_buffer) ... else if (resource) ... else ... ...instead of this: if (!is_user_buffer) if (resource) ... else ... else ... Signed-off-by: Erik Faye-Lund <erik.faye-lund@collabora.com> Reviewed-by: Alok Hota <alok.hota@intel.com>
-rw-r--r--src/gallium/drivers/swr/swr_state.cpp49
1 files changed, 25 insertions, 24 deletions
diff --git a/src/gallium/drivers/swr/swr_state.cpp b/src/gallium/drivers/swr/swr_state.cpp
index 42d196fb3c5..e7f1c99b974 100644
--- a/src/gallium/drivers/swr/swr_state.cpp
+++ b/src/gallium/drivers/swr/swr_state.cpp
@@ -729,7 +729,7 @@ swr_update_resource_status(struct pipe_context *pipe,
/* VBO vertex buffers */
for (uint32_t i = 0; i < ctx->num_vertex_buffers; i++) {
struct pipe_vertex_buffer *vb = &ctx->vertex_buffer[i];
- if (!vb->is_user_buffer)
+ if (!vb->is_user_buffer && vb->buffer.resource)
swr_resource_read(vb->buffer.resource);
}
@@ -1269,28 +1269,7 @@ swr_update_derived(struct pipe_context *pipe,
struct pipe_vertex_buffer *vb = &ctx->vertex_buffer[i];
pitch = vb->stride;
- if (!vb->is_user_buffer) {
- /* VBO */
- if (!pitch) {
- /* If pitch=0 (ie vb->stride), buffer contains a single
- * constant attribute. Use the stream_pitch which was
- * calculated during creation of vertex_elements_state for the
- * size of the attribute. */
- size = ctx->velems->stream_pitch[i];
- elems = 1;
- partial_inbounds = 0;
- min_vertex_index = 0;
- } else {
- /* size is based on buffer->width0 rather than info.max_index
- * to prevent having to validate VBO on each draw. */
- size = vb->buffer.resource->width0;
- elems = size / pitch;
- partial_inbounds = size % pitch;
- min_vertex_index = 0;
- }
-
- p_data = swr_resource_data(vb->buffer.resource) + vb->buffer_offset;
- } else {
+ if (vb->is_user_buffer) {
/* Client buffer
* client memory is one-time use, re-trigger SWR_NEW_VERTEX to
* revalidate on each draw */
@@ -1315,7 +1294,29 @@ swr_update_derived(struct pipe_context *pipe,
ctx, &ctx->scratch->vertex_buffer, ptr, size);
p_data = (const uint8_t *)ptr - base;
}
- }
+ } else if (vb->buffer.resource) {
+ /* VBO */
+ if (!pitch) {
+ /* If pitch=0 (ie vb->stride), buffer contains a single
+ * constant attribute. Use the stream_pitch which was
+ * calculated during creation of vertex_elements_state for the
+ * size of the attribute. */
+ size = ctx->velems->stream_pitch[i];
+ elems = 1;
+ partial_inbounds = 0;
+ min_vertex_index = 0;
+ } else {
+ /* size is based on buffer->width0 rather than info.max_index
+ * to prevent having to validate VBO on each draw. */
+ size = vb->buffer.resource->width0;
+ elems = size / pitch;
+ partial_inbounds = size % pitch;
+ min_vertex_index = 0;
+ }
+
+ p_data = swr_resource_data(vb->buffer.resource) + vb->buffer_offset;
+ } else
+ p_data = NULL;
swrVertexBuffers[i] = {0};
swrVertexBuffers[i].index = i;