static void gen6_emit_drawing_rectangle(struct intel_batchbuffer *batch, struct scratch_buf *dst) { OUT_BATCH(GEN6_3DSTATE_DRAWING_RECTANGLE | (4 - 2)); OUT_BATCH(0); OUT_BATCH((buf_height(dst) - 1) << 16 | (buf_width(dst) - 1)); OUT_BATCH(0); }
//---------- Begin of function VgaBuf::line -------------// // // Draw a line // // <int> x1,y1,x2,y2 = the coordination of the line // <int> lineColor = color of the line // void VgaBuf::line(int x1,int y1,int x2,int y2,int lineColor) { if( is_front ) mouse.hide_area( x1,y1,x2,y2 ); // if the mouse cursor is in that area, hide it IMGline(cur_buf_ptr, cur_pitch, buf_width(), buf_height(), x1, y1, x2, y2, translate_color(lineColor)); if( is_front ) mouse.show_area(); }
static void check_render_copyfunc(void) { struct scratch_buf src, dst; uint32_t *ptr; int i, j, pass; if (!options.check_render_cpyfn) return; init_buffer(&src, options.scratch_buf_size); init_buffer(&dst, options.scratch_buf_size); for (pass = 0; pass < 16; pass++) { int sx = random() % (buf_width(&src)-options.tile_size); int sy = random() % (buf_height(&src)-options.tile_size); int dx = random() % (buf_width(&dst)-options.tile_size); int dy = random() % (buf_height(&dst)-options.tile_size); if (options.use_cpu_maps) set_to_cpu_domain(&src, 1); memset(src.data, 0xff, options.scratch_buf_size); for (j = 0; j < options.tile_size; j++) { ptr = (uint32_t*)((char *)src.data + sx*4 + (sy+j) * src.stride); for (i = 0; i < options.tile_size; i++) ptr[i] = j * options.tile_size + i; } render_copyfunc(&src, sx, sy, &dst, dx, dy, 0); if (options.use_cpu_maps) set_to_cpu_domain(&dst, 0); for (j = 0; j < options.tile_size; j++) { ptr = (uint32_t*)((char *)dst.data + dx*4 + (dy+j) * dst.stride); for (i = 0; i < options.tile_size; i++) if (ptr[i] != j * options.tile_size + i) { printf("render copyfunc mismatch at (%d, %d): found %d, expected %d\n", i, j, ptr[i], j*options.tile_size + i); } } } }
static void sanitize_stride(struct scratch_buf *buf) { if (buf_height(buf) > options.max_dimension) buf->stride = options.scratch_buf_size / options.max_dimension; if (buf_height(buf) < options.tile_size) buf->stride = options.scratch_buf_size / options.tile_size; if (buf_width(buf) < options.tile_size) buf->stride = options.tile_size * sizeof(uint32_t); assert(buf->stride <= 8192); assert(buf_width(buf) <= options.max_dimension); assert(buf_height(buf) <= options.max_dimension); assert(buf_width(buf) >= options.tile_size); assert(buf_height(buf) >= options.tile_size); }
static uint32_t gen6_bind_buf(struct intel_batchbuffer *batch, struct scratch_buf *buf, uint32_t format, int is_dst) { struct gen6_surface_state *ss; uint32_t write_domain, read_domain; int ret; if (is_dst) { write_domain = read_domain = I915_GEM_DOMAIN_RENDER; } else { write_domain = 0; read_domain = I915_GEM_DOMAIN_SAMPLER; } ss = batch_alloc(batch, sizeof(*ss), 32); ss->ss0.surface_type = GEN6_SURFACE_2D; ss->ss0.surface_format = format; ss->ss0.data_return_format = GEN6_SURFACERETURNFORMAT_FLOAT32; ss->ss0.color_blend = 1; ss->ss1.base_addr = buf->bo->offset; ret = drm_intel_bo_emit_reloc(batch->bo, batch_offset(batch, ss) + 4, buf->bo, 0, read_domain, write_domain); assert(ret == 0); ss->ss2.height = buf_height(buf) - 1; ss->ss2.width = buf_width(buf) - 1; ss->ss3.pitch = buf->stride - 1; ss->ss3.tiled_surface = buf->tiling != I915_TILING_NONE; ss->ss3.tile_walk = buf->tiling == I915_TILING_Y; return batch_offset(batch, ss); }
//---------- Begin of function VgaBuf::thick_line -------------// // // Draw a thick line // // <int> x1,y1,x2,y2 = the coordination of the line // <int> lineColor = color of the line // void VgaBuf::thick_line(int x1,int y1,int x2,int y2,int lineColor) { err_when( x1<0 || y1<0 || x2>=VGA_WIDTH || y2>=VGA_HEIGHT ); if( is_front ) mouse.hide_area( x1,y1,x2,y2 ); // if the mouse cursor is in that area, hide it if( y1-y2 > abs(x2-x1) ) // keep thickness of the line to 3 { IMGline(cur_buf_ptr, cur_pitch, buf_width(), buf_height(), x1 , y1-1, x2 , y2-1, lineColor ); IMGline(cur_buf_ptr, cur_pitch, buf_width(), buf_height(), x1 , y1 , x2 , y2 , lineColor ); IMGline(cur_buf_ptr, cur_pitch, buf_width(), buf_height(), x1 , y1+1, x2 , y2+1, lineColor ); IMGline(cur_buf_ptr, cur_pitch, buf_width(), buf_height(), x1+1, y1+1, x2+1, y2+1, lineColor ); } else if( y2-y1 > abs(x2-x1) ) { IMGline(cur_buf_ptr, cur_pitch, buf_width(), buf_height(), x1+1, y1-1, x2+1, y2-1, lineColor ); IMGline(cur_buf_ptr, cur_pitch, buf_width(), buf_height(), x1 , y1-1, x2 , y2-1, lineColor ); IMGline(cur_buf_ptr, cur_pitch, buf_width(), buf_height(), x1 , y1 , x2 , y2 , lineColor ); IMGline(cur_buf_ptr, cur_pitch, buf_width(), buf_height(), x1 , y1+1, x2 , y2+1, lineColor ); } else { IMGline(cur_buf_ptr, cur_pitch, buf_width(), buf_height(), x1, y1-1, x2, y2-1, lineColor ); IMGline(cur_buf_ptr, cur_pitch, buf_width(), buf_height(), x1, y1 , x2, y2 , lineColor ); IMGline(cur_buf_ptr, cur_pitch, buf_width(), buf_height(), x1, y1+1, x2, y2+1, lineColor ); } if( is_front ) mouse.show_area(); }
void gen6_render_copyfunc(struct intel_batchbuffer *batch, struct scratch_buf *src, unsigned src_x, unsigned src_y, unsigned width, unsigned height, struct scratch_buf *dst, unsigned dst_x, unsigned dst_y) { uint32_t wm_state, wm_kernel, wm_table; uint32_t cc_vp, cc_blend, offset; uint32_t batch_end; intel_batchbuffer_flush(batch); batch->ptr = batch->buffer + 1024; batch_alloc(batch, 64, 64); wm_table = gen6_bind_surfaces(batch, src, dst); wm_kernel = gen6_create_kernel(batch); wm_state = gen6_create_sampler(batch, SAMPLER_FILTER_NEAREST, SAMPLER_EXTEND_NONE); cc_vp = gen6_create_cc_viewport(batch); cc_blend = gen6_create_cc_blend(batch); batch->ptr = batch->buffer; gen6_emit_invariant(batch); gen6_emit_state_base_address(batch); gen6_emit_sip(batch); gen6_emit_urb(batch); gen6_emit_viewports(batch, cc_vp); gen6_emit_vs(batch); gen6_emit_gs(batch); gen6_emit_clip(batch); gen6_emit_wm_constants(batch); gen6_emit_null_depth_buffer(batch); gen6_emit_drawing_rectangle(batch, dst); gen6_emit_cc(batch, cc_blend); gen6_emit_sampler(batch, wm_state); gen6_emit_sf(batch); gen6_emit_wm(batch, wm_kernel); gen6_emit_vertex_elements(batch); gen6_emit_binding_table(batch, wm_table); gen6_emit_vertex_buffer(batch); offset = gen6_emit_primitive(batch); OUT_BATCH(MI_BATCH_BUFFER_END); batch_end = batch_align(batch, 8); *(uint32_t*)(batch->buffer + offset) = batch_round_upto(batch, VERTEX_SIZE)/VERTEX_SIZE; emit_vertex_2s(batch, dst_x + width, dst_y + height); emit_vertex_normalized(batch, src_x + width, buf_width(src)); emit_vertex_normalized(batch, src_y + height, buf_height(src)); emit_vertex_2s(batch, dst_x, dst_y + height); emit_vertex_normalized(batch, src_x, buf_width(src)); emit_vertex_normalized(batch, src_y + height, buf_height(src)); emit_vertex_2s(batch, dst_x, dst_y); emit_vertex_normalized(batch, src_x, buf_width(src)); emit_vertex_normalized(batch, src_y, buf_height(src)); gen6_render_flush(batch, batch_end); intel_batchbuffer_reset(batch); }