summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/r600/r600_resource.h
diff options
context:
space:
mode:
authorJerome Glisse <jglisse@redhat.com>2010-12-08 13:41:25 -0500
committerJerome Glisse <jglisse@redhat.com>2010-12-09 16:07:05 -0500
commit7055068eeae7f64166cca513282829d5a3e9b9d3 (patch)
tree261aaee82fb5ee70a056da3db53e7c800db40354 /src/gallium/drivers/r600/r600_resource.h
parent15753cf54d57b1ebb0cd41b7dbb8030d23213891 (diff)
r600g: specialized upload manager
Allow important performance increase by doing hw specific implementation of the upload manager helper. Drop the range flushing that is not hit with this code (and wasn't with previous neither). Performance improvement are mostly visible on slow CPU. Signed-off-by: Jerome Glisse <jglisse@redhat.com>
Diffstat (limited to 'src/gallium/drivers/r600/r600_resource.h')
-rw-r--r--src/gallium/drivers/r600/r600_resource.h25
1 files changed, 16 insertions, 9 deletions
diff --git a/src/gallium/drivers/r600/r600_resource.h b/src/gallium/drivers/r600/r600_resource.h
index 25aa84682c..e21916f2af 100644
--- a/src/gallium/drivers/r600/r600_resource.h
+++ b/src/gallium/drivers/r600/r600_resource.h
@@ -46,6 +46,7 @@ struct r600_resource {
struct u_resource base;
struct r600_bo *bo;
u32 size;
+ unsigned bo_size;
};
struct r600_resource_texture {
@@ -74,19 +75,12 @@ struct pipe_resource *r600_texture_from_handle(struct pipe_screen *screen,
struct winsys_handle *whandle);
#define R600_BUFFER_MAGIC 0xabcd1600
-#define R600_BUFFER_MAX_RANGES 32
-
-struct r600_buffer_range {
- uint32_t start;
- uint32_t end;
-};
struct r600_resource_buffer {
struct r600_resource r;
uint32_t magic;
void *user_buffer;
- struct r600_buffer_range ranges[R600_BUFFER_MAX_RANGES];
- unsigned num_ranges;
+ bool uploaded;
};
/* r600_buffer */
@@ -101,7 +95,9 @@ static INLINE struct r600_resource_buffer *r600_buffer(struct pipe_resource *buf
static INLINE boolean r600_buffer_is_user_buffer(struct pipe_resource *buffer)
{
- return r600_buffer(buffer)->user_buffer ? TRUE : FALSE;
+ if (r600_buffer(buffer)->uploaded)
+ return FALSE;
+ return r600_buffer(buffer)->user_buffer ? TRUE : FALSE;
}
int r600_texture_depth_flush(struct pipe_context *ctx,
@@ -127,4 +123,15 @@ struct r600_surface {
unsigned aligned_height;
};
+struct r600_pipe_context;
+struct r600_upload *r600_upload_create(struct r600_pipe_context *rctx,
+ unsigned default_size,
+ unsigned alignment);
+void r600_upload_flush(struct r600_upload *upload);
+void r600_upload_destroy(struct r600_upload *upload);
+int r600_upload_buffer(struct r600_upload *upload, unsigned offset,
+ unsigned size, struct r600_resource_buffer *in_buffer,
+ unsigned *out_offset, unsigned *out_size,
+ struct r600_bo **out_buffer);
+
#endif