summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/intel
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-02-11 19:40:08 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2011-02-21 12:59:36 +0000
commit3630d5b69afcecc3142d2c4897835175886f4bd8 (patch)
treee2d71c52a66f6f674d022b7007a3cba82df0aeae /src/mesa/drivers/dri/intel
parentdfc6c96e5c470f6136cad26b753c024538fd09a0 (diff)
intel: combine short memcpy using a temporary allocated buffer
Using a temporary buffer for large discontiguous uploads into the common buffer and a single buffered upload is faster than performing the discontiguous copies through a mapping into the GTT. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Diffstat (limited to 'src/mesa/drivers/dri/intel')
-rw-r--r--src/mesa/drivers/dri/intel/intel_buffer_objects.c46
-rw-r--r--src/mesa/drivers/dri/intel/intel_buffer_objects.h8
2 files changed, 21 insertions, 33 deletions
diff --git a/src/mesa/drivers/dri/intel/intel_buffer_objects.c b/src/mesa/drivers/dri/intel/intel_buffer_objects.c
index 4edf29ec75..9d54f47fea 100644
--- a/src/mesa/drivers/dri/intel/intel_buffer_objects.c
+++ b/src/mesa/drivers/dri/intel/intel_buffer_objects.c
@@ -619,7 +619,7 @@ void intel_upload_data(struct intel_context *intel,
*return_offset = intel->upload.offset;
if (intel->upload.buffer_len &&
- intel->upload.buffer_len + asize > sizeof(intel->upload.buffer))
+ intel->upload.buffer_len + size > sizeof(intel->upload.buffer))
{
drm_intel_bo_subdata(intel->upload.bo,
intel->upload.buffer_offset,
@@ -646,25 +646,12 @@ void intel_upload_data(struct intel_context *intel,
intel->upload.offset += asize;
}
-void *intel_upload_map(struct intel_context *intel,
- GLuint size,
- drm_intel_bo **return_bo,
- GLuint *return_offset)
+void *intel_upload_map(struct intel_context *intel, GLuint size)
{
- GLuint asize = ALIGN(size, 64);
char *ptr;
- if (intel->upload.bo == NULL ||
- intel->upload.offset + size > intel->upload.bo->size) {
- wrap_buffers(intel, size);
- }
-
- drm_intel_bo_reference(intel->upload.bo);
- *return_bo = intel->upload.bo;
- *return_offset = intel->upload.offset;
-
if (intel->upload.buffer_len &&
- intel->upload.buffer_len + asize > sizeof(intel->upload.buffer))
+ intel->upload.buffer_len + size > sizeof(intel->upload.buffer))
{
drm_intel_bo_subdata(intel->upload.bo,
intel->upload.buffer_offset,
@@ -673,26 +660,25 @@ void *intel_upload_map(struct intel_context *intel,
intel->upload.buffer_len = 0;
}
- if (size < sizeof(intel->upload.buffer))
- {
- if (intel->upload.buffer_len == 0)
- intel->upload.buffer_offset = intel->upload.offset;
-
+ if (size <= sizeof(intel->upload.buffer))
ptr = intel->upload.buffer + intel->upload.buffer_len;
- intel->upload.buffer_len += asize;
- }
else
- {
- drm_intel_gem_bo_map_gtt(intel->upload.bo);
- ptr = intel->upload.bo->virtual;
- ptr += intel->upload.offset;
- }
-
- intel->upload.offset += asize;
+ ptr = malloc(size);
return ptr;
}
+void intel_upload_unmap(struct intel_context *intel,
+ const void *ptr, GLuint size,
+ drm_intel_bo **return_bo,
+ GLuint *return_offset)
+{
+ intel_upload_data(intel, ptr, size, return_bo, return_offset);
+
+ if (size > sizeof(intel->upload.buffer))
+ free((void*)ptr);
+}
+
drm_intel_bo *
intel_bufferobj_source(struct intel_context *intel,
struct intel_buffer_object *intel_obj,
diff --git a/src/mesa/drivers/dri/intel/intel_buffer_objects.h b/src/mesa/drivers/dri/intel/intel_buffer_objects.h
index 4b66bf7d59..2d86becdf3 100644
--- a/src/mesa/drivers/dri/intel/intel_buffer_objects.h
+++ b/src/mesa/drivers/dri/intel/intel_buffer_objects.h
@@ -76,9 +76,11 @@ void intel_upload_data(struct intel_context *intel,
GLuint *return_offset);
void *intel_upload_map(struct intel_context *intel,
- GLuint size,
- drm_intel_bo **return_bo,
- GLuint *return_offset);
+ GLuint size);
+void intel_upload_unmap(struct intel_context *intel,
+ const void *ptr, GLuint size,
+ drm_intel_bo **return_bo,
+ GLuint *return_offset);
void intel_upload_finish(struct intel_context *intel);