diff options
author | Erik Faye-Lund <[email protected]> | 2019-03-06 13:28:51 +0100 |
---|---|---|
committer | Erik Faye-Lund <[email protected]> | 2019-04-29 10:28:38 +0000 |
commit | ef13691e0c07d909a4f14280ca4fefbd79a9865b (patch) | |
tree | 784630d6eb769603a6592efd05dc0c0b4dfa8290 /src | |
parent | 04b0c6e9df718ff0f4d9f74c2a7142de44b0eb97 (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 <[email protected]>
Reviewed-by: Alok Hota <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/gallium/drivers/swr/swr_state.cpp | 49 |
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; |