示例#1
0
void *intel_upload_map(struct intel_context *intel, GLuint size, GLuint align)
{
   GLuint base, delta;
   char *ptr;

   base = (intel->upload.offset + align - 1) / align * align;
   if (intel->upload.bo == NULL || base + size > intel->upload.bo->size) {
      wrap_buffers(intel, size);
      base = 0;
   }

   delta = base - intel->upload.offset;
   if (intel->upload.buffer_len &&
       intel->upload.buffer_len + delta + size > sizeof(intel->upload.buffer))
   {
      drm_intel_bo_subdata(intel->upload.bo,
			   intel->upload.buffer_offset,
			   intel->upload.buffer_len,
			   intel->upload.buffer);
      intel->upload.buffer_len = 0;
   }

   if (size <= sizeof(intel->upload.buffer)) {
      if (intel->upload.buffer_len == 0)
	 intel->upload.buffer_offset = base;
      else
	 intel->upload.buffer_len += delta;

      ptr = intel->upload.buffer + intel->upload.buffer_len;
      intel->upload.buffer_len += size;
   } else
      ptr = malloc(size);

   return ptr;
}
示例#2
0
static void get_space( struct brw_context *brw,
		       GLuint size,
		       struct gl_buffer_object **vbo_return,
		       GLuint *offset_return )
{
   size = ALIGN(size, 64);
   
   if (brw->vb.upload.offset + size > BRW_UPLOAD_INIT_SIZE)
      wrap_buffers(brw, size);

   *vbo_return = brw->vb.upload.vbo[brw->vb.upload.buf];
   *offset_return = brw->vb.upload.offset;

   brw->vb.upload.offset += size;
}
示例#3
0
void intel_upload_data(struct intel_context *intel,
		       const void *ptr, GLuint size, GLuint align,
		       drm_intel_bo **return_bo,
		       GLuint *return_offset)
{
   GLuint base, delta;

   base = (intel->upload.offset + align - 1) / align * align;
   if (intel->upload.bo == NULL || base + size > intel->upload.bo->size) {
      wrap_buffers(intel, size);
      base = 0;
   }

   drm_intel_bo_reference(intel->upload.bo);
   *return_bo = intel->upload.bo;
   *return_offset = base;

   delta = base - intel->upload.offset;
   if (intel->upload.buffer_len &&
       intel->upload.buffer_len + delta + size > sizeof(intel->upload.buffer))
   {
      drm_intel_bo_subdata(intel->upload.bo,
			   intel->upload.buffer_offset,
			   intel->upload.buffer_len,
			   intel->upload.buffer);
      intel->upload.buffer_len = 0;
   }

   if (size < sizeof(intel->upload.buffer))
   {
      if (intel->upload.buffer_len == 0)
	 intel->upload.buffer_offset = base;
      else
	 intel->upload.buffer_len += delta;

      memcpy(intel->upload.buffer + intel->upload.buffer_len, ptr, size);
      intel->upload.buffer_len += size;
   }
   else
   {
      drm_intel_bo_subdata(intel->upload.bo, base, size, ptr);
   }

   intel->upload.offset = base + size;
}
示例#4
0
static void get_space( struct brw_context *brw,
		       GLuint size,
		       dri_bo **bo_return,
		       GLuint *offset_return )
{
   size = ALIGN(size, 64);

   if (brw->vb.upload.bo == NULL ||
       brw->vb.upload.offset + size > brw->vb.upload.bo->size) {
      wrap_buffers(brw, size);
   }

   assert(*bo_return == NULL);
   dri_bo_reference(brw->vb.upload.bo);
   *bo_return = brw->vb.upload.bo;
   *offset_return = brw->vb.upload.offset;
   brw->vb.upload.offset += size;
}
示例#5
0
void
intel_upload_data(struct brw_context *brw,
                  const void *ptr, GLuint size, GLuint align,
                  drm_intel_bo **return_bo,
                  GLuint *return_offset)
{
   GLuint base, delta;

   base = (brw->upload.offset + align - 1) / align * align;
   if (brw->upload.bo == NULL || base + size > brw->upload.bo->size) {
      wrap_buffers(brw, size);
      base = 0;
   }

   drm_intel_bo_reference(brw->upload.bo);
   *return_bo = brw->upload.bo;
   *return_offset = base;

   delta = base - brw->upload.offset;
   if (brw->upload.buffer_len &&
       brw->upload.buffer_len + delta + size > sizeof(brw->upload.buffer)) {
      drm_intel_bo_subdata(brw->upload.bo,
                           brw->upload.buffer_offset,
                           brw->upload.buffer_len,
                           brw->upload.buffer);
      brw->upload.buffer_len = 0;
   }

   if (size < sizeof(brw->upload.buffer)) {
      if (brw->upload.buffer_len == 0)
         brw->upload.buffer_offset = base;
      else
         brw->upload.buffer_len += delta;

      memcpy(brw->upload.buffer + brw->upload.buffer_len, ptr, size);
      brw->upload.buffer_len += size;
   } else {
      drm_intel_bo_subdata(brw->upload.bo, base, size, ptr);
   }

   brw->upload.offset = base + size;
}
示例#6
0
void *
intel_upload_map(struct brw_context *brw, GLuint size, GLuint align)
{
   GLuint base, delta;
   char *ptr;

   base = (brw->upload.offset + align - 1) / align * align;
   if (brw->upload.bo == NULL || base + size > brw->upload.bo->size) {
      wrap_buffers(brw, size);
      base = 0;
   }

   delta = base - brw->upload.offset;
   if (brw->upload.buffer_len &&
       brw->upload.buffer_len + delta + size > sizeof(brw->upload.buffer)) {
      drm_intel_bo_subdata(brw->upload.bo,
                           brw->upload.buffer_offset,
                           brw->upload.buffer_len,
                           brw->upload.buffer);
      brw->upload.buffer_len = 0;
   }

   if (size <= sizeof(brw->upload.buffer)) {
      if (brw->upload.buffer_len == 0)
         brw->upload.buffer_offset = base;
      else
         brw->upload.buffer_len += delta;

      ptr = brw->upload.buffer + brw->upload.buffer_len;
      brw->upload.buffer_len += size;
   } else {
      ptr = malloc(size);
   }

   return ptr;
}