projects
/
mesa.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
svga: Fix banded DMA upload unmap
[mesa.git]
/
src
/
gallium
/
drivers
/
svga
/
svga_resource_buffer.h
diff --git
a/src/gallium/drivers/svga/svga_resource_buffer.h
b/src/gallium/drivers/svga/svga_resource_buffer.h
index 05025e963bcd6b2fc068bc386e189ad4b6742210..35ed35d61ddafaab62c79060416bdcbc4ebca78d 100644
(file)
--- a/
src/gallium/drivers/svga/svga_resource_buffer.h
+++ b/
src/gallium/drivers/svga/svga_resource_buffer.h
@@
-58,10
+58,22
@@
struct svga_buffer_range
struct svga_3d_update_gb_image;
struct svga_3d_update_gb_image;
+/**
+ * This structure describes the bind flags and cache key associated
+ * with the host surface.
+ */
+struct svga_buffer_surface
+{
+ struct list_head list;
+ unsigned bind_flags;
+ struct svga_host_surface_cache_key key;
+ struct svga_winsys_surface *handle;
+};
+
/**
* SVGA pipe buffer.
*/
/**
* SVGA pipe buffer.
*/
-struct svga_buffer
+struct svga_buffer
{
struct u_resource b;
{
struct u_resource b;
@@
-70,36
+82,42
@@
struct svga_buffer
/**
* Regular (non DMA'able) memory.
/**
* Regular (non DMA'able) memory.
- *
+ *
* Used for user buffers or for buffers which we know before hand that can
* never be used by the virtual hardware directly, such as constant buffers.
*/
void *swbuf;
* Used for user buffers or for buffers which we know before hand that can
* never be used by the virtual hardware directly, such as constant buffers.
*/
void *swbuf;
-
- /**
+
+ /**
* Whether swbuf was created by the user or not.
*/
boolean user;
* Whether swbuf was created by the user or not.
*/
boolean user;
-
+
/**
* Creation key for the host surface handle.
/**
* Creation key for the host surface handle.
- *
- * This structure describes all the host surface characteristics so that it
+ *
+ * This structure describes all the host surface characteristics so that it
* can be looked up in cache, since creating a host surface is often a slow
* operation.
*/
struct svga_host_surface_cache_key key;
* can be looked up in cache, since creating a host surface is often a slow
* operation.
*/
struct svga_host_surface_cache_key key;
-
+
/**
* Host surface handle.
/**
* Host surface handle.
- *
- * This is a platform independent abstraction for host SID. We create when
+ *
+ * This is a platform independent abstraction for host SID. We create when
* trying to bind.
*
* Only set for non-user buffers.
*/
struct svga_winsys_surface *handle;
* trying to bind.
*
* Only set for non-user buffers.
*/
struct svga_winsys_surface *handle;
+ /**
+ * List of surfaces created for this buffer resource to support
+ * incompatible bind flags.
+ */
+ struct list_head surfaces;
+
/**
* Information about ongoing and past map operations.
*/
/**
* Information about ongoing and past map operations.
*/
@@
-219,8
+237,8
@@
svga_buffer(struct pipe_resource *resource)
* Returns TRUE for user buffers. We may
* decide to use an alternate upload path for these buffers.
*/
* Returns TRUE for user buffers. We may
* decide to use an alternate upload path for these buffers.
*/
-static inline boolean
-svga_buffer_is_user_buffer(
struct pipe_resource *buffer
)
+static inline boolean
+svga_buffer_is_user_buffer(
struct pipe_resource *buffer
)
{
if (buffer) {
return svga_buffer(buffer)->user;
{
if (buffer) {
return svga_buffer(buffer)->user;
@@
-296,6
+314,15
@@
svga_buffer_hw_storage_unmap(struct svga_context *svga,
ret = SVGA3D_BindGBSurface(swc, sbuf->handle);
assert(ret == PIPE_OK);
}
ret = SVGA3D_BindGBSurface(swc, sbuf->handle);
assert(ret == PIPE_OK);
}
+ if (swc->force_coherent) {
+ ret = SVGA3D_UpdateGBSurface(swc, sbuf->handle);
+ if (ret != PIPE_OK) {
+ /* flush and retry */
+ svga_context_flush(svga, NULL);
+ ret = SVGA3D_UpdateGBSurface(swc, sbuf->handle);
+ assert(ret == PIPE_OK);
+ }
+ }
}
} else
sws->buffer_unmap(sws, sbuf->hwbuf);
}
} else
sws->buffer_unmap(sws, sbuf->hwbuf);
@@
-306,11
+333,11
@@
struct pipe_resource *
svga_user_buffer_create(struct pipe_screen *screen,
void *ptr,
unsigned bytes,
svga_user_buffer_create(struct pipe_screen *screen,
void *ptr,
unsigned bytes,
- unsigned usage);
+
unsigned usage);
struct pipe_resource *
svga_buffer_create(struct pipe_screen *screen,
struct pipe_resource *
svga_buffer_create(struct pipe_screen *screen,
- const struct pipe_resource *template);
+
const struct pipe_resource *template);
@@
-325,14
+352,15
@@
svga_buffer_create(struct pipe_screen *screen,
*/
struct svga_winsys_surface *
svga_buffer_handle(struct svga_context *svga,
*/
struct svga_winsys_surface *
svga_buffer_handle(struct svga_context *svga,
- struct pipe_resource *buf);
+ struct pipe_resource *buf,
+ unsigned tobind_flags);
void
svga_context_flush_buffers(struct svga_context *svga);
struct svga_winsys_buffer *
svga_winsys_buffer_create(struct svga_context *svga,
void
svga_context_flush_buffers(struct svga_context *svga);
struct svga_winsys_buffer *
svga_winsys_buffer_create(struct svga_context *svga,
- unsigned alignment,
+ unsigned alignment,
unsigned usage,
unsigned size);
unsigned usage,
unsigned size);