i965: Add a "write" parameter to intel_bufferobj_buffer.
This doesn't do anything yet, but soon we'll want to know whether an access to a buffer section may write that data, or simply reads it. Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
@@ -263,7 +263,7 @@ brw_dispatch_compute_indirect(struct gl_context *ctx, GLintptr indirect)
|
||||
struct brw_bo *bo =
|
||||
intel_bufferobj_buffer(brw,
|
||||
intel_buffer_object(indirect_buffer),
|
||||
indirect, 3 * sizeof(GLuint));
|
||||
indirect, 3 * sizeof(GLuint), false);
|
||||
|
||||
brw->compute.num_work_groups_bo = bo;
|
||||
brw->compute.num_work_groups_offset = indirect;
|
||||
|
||||
@@ -222,7 +222,7 @@ brw_emit_prim(struct brw_context *brw,
|
||||
struct gl_buffer_object *indirect_buffer = brw->ctx.DrawIndirectBuffer;
|
||||
struct brw_bo *bo = intel_bufferobj_buffer(brw,
|
||||
intel_buffer_object(indirect_buffer),
|
||||
prim->indirect_offset, 5 * sizeof(GLuint));
|
||||
prim->indirect_offset, 5 * sizeof(GLuint), false);
|
||||
|
||||
indirect_flag = GEN7_3DPRIM_INDIRECT_PARAMETER_ENABLE;
|
||||
|
||||
|
||||
@@ -622,7 +622,8 @@ brw_prepare_vertices(struct brw_context *brw)
|
||||
const uint32_t start = buffer_range_start[i];
|
||||
const uint32_t range = buffer_range_end[i] - buffer_range_start[i];
|
||||
|
||||
buffer->bo = intel_bufferobj_buffer(brw, enabled_buffer[i], start, range);
|
||||
buffer->bo = intel_bufferobj_buffer(brw, enabled_buffer[i], start,
|
||||
range, false);
|
||||
brw_bo_reference(buffer->bo);
|
||||
}
|
||||
|
||||
@@ -739,7 +740,7 @@ brw_upload_indices(struct brw_context *brw)
|
||||
|
||||
struct brw_bo *bo =
|
||||
intel_bufferobj_buffer(brw, intel_buffer_object(bufferobj),
|
||||
offset, ib_size);
|
||||
offset, ib_size, false);
|
||||
if (bo != brw->ib.bo) {
|
||||
brw_bo_unreference(brw->ib.bo);
|
||||
brw->ib.bo = bo;
|
||||
|
||||
@@ -698,7 +698,8 @@ brw_update_buffer_texture_surface(struct gl_context *ctx,
|
||||
|
||||
if (intel_obj) {
|
||||
size = MIN2(size, intel_obj->Base.Size);
|
||||
bo = intel_bufferobj_buffer(brw, intel_obj, tObj->BufferOffset, size);
|
||||
bo = intel_bufferobj_buffer(brw, intel_obj, tObj->BufferOffset, size,
|
||||
false);
|
||||
}
|
||||
|
||||
/* The ARB_texture_buffer_specification says:
|
||||
@@ -786,7 +787,8 @@ brw_update_sol_surface(struct brw_context *brw,
|
||||
uint32_t offset_bytes = 4 * offset_dwords;
|
||||
struct brw_bo *bo = intel_bufferobj_buffer(brw, intel_bo,
|
||||
offset_bytes,
|
||||
buffer_obj->Size - offset_bytes);
|
||||
buffer_obj->Size - offset_bytes,
|
||||
true);
|
||||
uint32_t *surf = brw_state_batch(brw, 6 * 4, 32, out_offset);
|
||||
uint32_t pitch_minus_1 = 4*stride_dwords - 1;
|
||||
size_t size_dwords = buffer_obj->Size / 4;
|
||||
@@ -1412,7 +1414,7 @@ brw_upload_ubo_surfaces(struct brw_context *brw, struct gl_program *prog,
|
||||
struct brw_bo *bo =
|
||||
intel_bufferobj_buffer(brw, intel_bo,
|
||||
binding->Offset,
|
||||
size);
|
||||
size, false);
|
||||
brw_create_constant_surface(brw, bo, binding->Offset,
|
||||
size,
|
||||
&ubo_surf_offsets[i]);
|
||||
@@ -1437,7 +1439,7 @@ brw_upload_ubo_surfaces(struct brw_context *brw, struct gl_program *prog,
|
||||
struct brw_bo *bo =
|
||||
intel_bufferobj_buffer(brw, intel_bo,
|
||||
binding->Offset,
|
||||
size);
|
||||
size, true);
|
||||
brw_create_buffer_surface(brw, bo, binding->Offset,
|
||||
size,
|
||||
&ssbo_surf_offsets[i]);
|
||||
@@ -1509,8 +1511,10 @@ brw_upload_abo_surfaces(struct brw_context *brw,
|
||||
&ctx->AtomicBufferBindings[prog->sh.AtomicBuffers[i]->Binding];
|
||||
struct intel_buffer_object *intel_bo =
|
||||
intel_buffer_object(binding->BufferObject);
|
||||
struct brw_bo *bo = intel_bufferobj_buffer(
|
||||
brw, intel_bo, binding->Offset, intel_bo->Base.Size - binding->Offset);
|
||||
struct brw_bo *bo =
|
||||
intel_bufferobj_buffer(brw, intel_bo, binding->Offset,
|
||||
intel_bo->Base.Size - binding->Offset,
|
||||
true);
|
||||
|
||||
brw_emit_buffer_surface_state(brw, &surf_offsets[i], bo,
|
||||
binding->Offset, ISL_FORMAT_RAW,
|
||||
|
||||
@@ -3387,7 +3387,7 @@ genX(upload_3dstate_so_buffers)(struct brw_context *brw)
|
||||
assert(start % 4 == 0);
|
||||
uint32_t end = ALIGN(start + xfb_obj->Size[i], 4);
|
||||
struct brw_bo *bo =
|
||||
intel_bufferobj_buffer(brw, bufferobj, start, end - start);
|
||||
intel_bufferobj_buffer(brw, bufferobj, start, end - start, true);
|
||||
assert(end <= bo->size);
|
||||
|
||||
brw_batch_emit(brw, GENX(3DSTATE_SO_BUFFER), sob) {
|
||||
|
||||
@@ -540,7 +540,7 @@ brw_unmap_buffer(struct gl_context *ctx,
|
||||
struct brw_bo *
|
||||
intel_bufferobj_buffer(struct brw_context *brw,
|
||||
struct intel_buffer_object *intel_obj,
|
||||
uint32_t offset, uint32_t size)
|
||||
uint32_t offset, uint32_t size, bool write)
|
||||
{
|
||||
/* This is needed so that things like transform feedback and texture buffer
|
||||
* objects that need a BO but don't want to check that they exist for
|
||||
@@ -576,8 +576,8 @@ brw_copy_buffer_subdata(struct gl_context *ctx,
|
||||
if (size == 0)
|
||||
return;
|
||||
|
||||
dst_bo = intel_bufferobj_buffer(brw, intel_dst, write_offset, size);
|
||||
src_bo = intel_bufferobj_buffer(brw, intel_src, read_offset, size);
|
||||
dst_bo = intel_bufferobj_buffer(brw, intel_dst, write_offset, size, true);
|
||||
src_bo = intel_bufferobj_buffer(brw, intel_src, read_offset, size, false);
|
||||
|
||||
intel_emit_linear_blit(brw,
|
||||
dst_bo, write_offset,
|
||||
|
||||
@@ -83,9 +83,10 @@ struct intel_buffer_object
|
||||
/* Get the bm buffer associated with a GL bufferobject:
|
||||
*/
|
||||
struct brw_bo *intel_bufferobj_buffer(struct brw_context *brw,
|
||||
struct intel_buffer_object *obj,
|
||||
uint32_t offset,
|
||||
uint32_t size);
|
||||
struct intel_buffer_object *obj,
|
||||
uint32_t offset,
|
||||
uint32_t size,
|
||||
bool write);
|
||||
|
||||
void intel_upload_data(struct brw_context *brw,
|
||||
const void *data,
|
||||
|
||||
@@ -109,7 +109,7 @@ do_blit_drawpixels(struct gl_context * ctx,
|
||||
format, type, 0, 0, 0);
|
||||
|
||||
src_buffer = intel_bufferobj_buffer(brw, src, src_offset,
|
||||
height * src_stride);
|
||||
height * src_stride, false);
|
||||
|
||||
struct intel_mipmap_tree *pbo_mt =
|
||||
intel_miptree_create_for_bo(brw,
|
||||
|
||||
@@ -335,7 +335,8 @@ intel_set_texture_storage_for_buffer_object(struct gl_context *ctx,
|
||||
|
||||
struct brw_bo *bo = intel_bufferobj_buffer(brw, intel_buffer_obj,
|
||||
buffer_offset,
|
||||
row_stride * image->Height);
|
||||
row_stride * image->Height,
|
||||
!read_only);
|
||||
intel_texobj->mt =
|
||||
intel_miptree_create_for_bo(brw, bo,
|
||||
image->TexFormat,
|
||||
|
||||
Reference in New Issue
Block a user