Home
last modified time | relevance | path

Searched refs:blitter (Results 1 – 25 of 115) sorted by relevance

12345

/external/mesa3d/src/gallium/drivers/ilo/
Dilo_blitter_rectlist.c40 ilo_blitter_set_invariants(struct ilo_blitter *blitter) in ilo_blitter_set_invariants() argument
44 if (blitter->initialized) in ilo_blitter_set_invariants()
48 blitter->draw_info.topology = GEN6_3DPRIM_RECTLIST; in ilo_blitter_set_invariants()
49 blitter->draw_info.vertex_count = 3; in ilo_blitter_set_invariants()
50 blitter->draw_info.instance_count = 1; in ilo_blitter_set_invariants()
58 ilo_state_vf_init_for_rectlist(&blitter->vf, blitter->ilo->dev, in ilo_blitter_set_invariants()
59 blitter->vf_data, sizeof(blitter->vf_data), &elem, 1); in ilo_blitter_set_invariants()
61 ilo_state_vs_init_disabled(&blitter->vs, blitter->ilo->dev); in ilo_blitter_set_invariants()
62 ilo_state_hs_init_disabled(&blitter->hs, blitter->ilo->dev); in ilo_blitter_set_invariants()
63 ilo_state_ds_init_disabled(&blitter->ds, blitter->ilo->dev); in ilo_blitter_set_invariants()
[all …]
Dilo_blitter_pipe.c42 ilo_blitter_pipe_begin(struct ilo_blitter *blitter, in ilo_blitter_pipe_begin() argument
46 struct blitter_context *b = blitter->pipe_blitter; in ilo_blitter_pipe_begin()
47 struct ilo_state_vector *vec = &blitter->ilo->state_vector; in ilo_blitter_pipe_begin()
87 blitter->ilo->render_condition.query, in ilo_blitter_pipe_begin()
88 blitter->ilo->render_condition.condition, in ilo_blitter_pipe_begin()
89 blitter->ilo->render_condition.mode); in ilo_blitter_pipe_begin()
107 ilo_blitter_pipe_end(struct ilo_blitter *blitter) in ilo_blitter_pipe_end() argument
112 ilo_blitter_pipe_blit(struct ilo_blitter *blitter, in ilo_blitter_pipe_blit() argument
115 struct blitter_context *b = blitter->pipe_blitter; in ilo_blitter_pipe_blit()
118 if (util_try_blit_via_copy_region(&blitter->ilo->base, info)) in ilo_blitter_pipe_blit()
[all …]
Dilo_blitter.c34 ilo_blitter_pipe_create(struct ilo_blitter *blitter) in ilo_blitter_pipe_create() argument
36 if (blitter->pipe_blitter) in ilo_blitter_pipe_create()
39 blitter->pipe_blitter = util_blitter_create(&blitter->ilo->base); in ilo_blitter_pipe_create()
41 return (blitter->pipe_blitter != NULL); in ilo_blitter_pipe_create()
51 struct ilo_blitter *blitter; in ilo_blitter_create() local
53 blitter = CALLOC_STRUCT(ilo_blitter); in ilo_blitter_create()
54 if (!blitter) in ilo_blitter_create()
57 blitter->ilo = ilo; in ilo_blitter_create()
59 if (!ilo_blitter_pipe_create(blitter)) { in ilo_blitter_create()
60 FREE(blitter); in ilo_blitter_create()
[all …]
Dilo_render_gen7.c660 const struct ilo_blitter *blitter) in gen7_rectlist_pcb_alloc() argument
662 gen7_3DSTATE_PUSH_CONSTANT_ALLOC_VS(r->builder, &blitter->urb); in gen7_rectlist_pcb_alloc()
663 gen7_3DSTATE_PUSH_CONSTANT_ALLOC_PS(r->builder, &blitter->urb); in gen7_rectlist_pcb_alloc()
671 const struct ilo_blitter *blitter) in gen7_rectlist_urb() argument
673 gen7_3DSTATE_URB_VS(r->builder, &blitter->urb); in gen7_rectlist_urb()
674 gen7_3DSTATE_URB_GS(r->builder, &blitter->urb); in gen7_rectlist_urb()
675 gen7_3DSTATE_URB_HS(r->builder, &blitter->urb); in gen7_rectlist_urb()
676 gen7_3DSTATE_URB_DS(r->builder, &blitter->urb); in gen7_rectlist_urb()
681 const struct ilo_blitter *blitter) in gen7_rectlist_vs_to_sf() argument
684 gen6_3DSTATE_VS(r->builder, &blitter->vs, 0, NULL); in gen7_rectlist_vs_to_sf()
[all …]
Dilo_blitter_blt.c40 ilo_blitter_blt_begin(struct ilo_blitter *blitter, int max_cmd_size, in ilo_blitter_blt_begin() argument
46 struct ilo_cp *cp = blitter->ilo->cp; in ilo_blitter_blt_begin()
117 ilo_blitter_blt_end(struct ilo_blitter *blitter, uint32_t swctrl) in ilo_blitter_blt_end() argument
119 struct ilo_builder *builder = &blitter->ilo->cp->builder; in ilo_blitter_blt_end()
129 buf_clear_region(struct ilo_blitter *blitter, in buf_clear_region() argument
137 struct ilo_builder *builder = &blitter->ilo->cp->builder; in buf_clear_region()
146 ilo_blitter_blt_begin(blitter, GEN6_COLOR_BLT__SIZE * in buf_clear_region()
175 ilo_blitter_blt_end(blitter, 0); in buf_clear_region()
181 buf_copy_region(struct ilo_blitter *blitter, in buf_copy_region() argument
187 struct ilo_builder *builder = &blitter->ilo->cp->builder; in buf_copy_region()
[all …]
Dilo_blitter.h97 ilo_blitter_destroy(struct ilo_blitter *blitter);
100 ilo_blitter_pipe_blit(struct ilo_blitter *blitter,
104 ilo_blitter_pipe_copy_resource(struct ilo_blitter *blitter,
111 ilo_blitter_pipe_clear_rt(struct ilo_blitter *blitter,
118 ilo_blitter_pipe_clear_zs(struct ilo_blitter *blitter,
126 ilo_blitter_pipe_clear_fb(struct ilo_blitter *blitter,
132 ilo_blitter_blt_copy_resource(struct ilo_blitter *blitter,
139 ilo_blitter_blt_clear_rt(struct ilo_blitter *blitter,
146 ilo_blitter_blt_clear_zs(struct ilo_blitter *blitter,
154 ilo_blitter_rectlist_clear_zs(struct ilo_blitter *blitter,
[all …]
Dilo_render_gen6.c819 const struct ilo_blitter *blitter) in gen6_rectlist_vs_to_sf() argument
825 gen6_3DSTATE_VS(r->builder, &blitter->vs, 0, NULL); in gen6_rectlist_vs_to_sf()
828 gen6_3DSTATE_GS(r->builder, &blitter->gs, 0, NULL); in gen6_rectlist_vs_to_sf()
830 gen6_3DSTATE_CLIP(r->builder, &blitter->fb.rs); in gen6_rectlist_vs_to_sf()
831 gen6_3DSTATE_SF(r->builder, &blitter->fb.rs, &blitter->sbe); in gen6_rectlist_vs_to_sf()
836 const struct ilo_blitter *blitter) in gen6_rectlist_wm() argument
841 gen6_3DSTATE_WM(r->builder, &blitter->fb.rs, &blitter->ps, 0, NULL); in gen6_rectlist_wm()
846 const struct ilo_blitter *blitter) in gen6_rectlist_wm_depth() argument
850 if (blitter->uses & (ILO_BLITTER_USE_FB_DEPTH | in gen6_rectlist_wm_depth()
852 gen6_3DSTATE_DEPTH_BUFFER(r->builder, &blitter->fb.dst.u.zs); in gen6_rectlist_wm_depth()
[all …]
/external/mesa3d/src/gallium/auxiliary/util/
Du_blitter.h74 void (*draw_rectangle)(struct blitter_context *blitter,
136 void util_blitter_destroy(struct blitter_context *blitter);
138 void util_blitter_cache_all_shaders(struct blitter_context *blitter);
144 struct pipe_context *util_blitter_get_pipe(struct blitter_context *blitter) in util_blitter_get_pipe() argument
146 return blitter->pipe; in util_blitter_get_pipe()
152 void util_blitter_set_texture_multisample(struct blitter_context *blitter,
157 void util_blitter_draw_rectangle(struct blitter_context *blitter,
182 void util_blitter_clear(struct blitter_context *blitter,
192 boolean util_blitter_is_copy_supported(struct blitter_context *blitter,
196 boolean util_blitter_is_blit_supported(struct blitter_context *blitter,
[all …]
Du_blitter.c417 void util_blitter_destroy(struct blitter_context *blitter) in util_blitter_destroy() argument
419 struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; in util_blitter_destroy()
420 struct pipe_context *pipe = blitter->pipe; in util_blitter_destroy()
498 void util_blitter_set_texture_multisample(struct blitter_context *blitter, in util_blitter_set_texture_multisample() argument
501 struct blitter_context_priv *ctx = (struct blitter_context_priv*)blitter; in util_blitter_set_texture_multisample()
506 void util_blitter_set_running_flag(struct blitter_context *blitter) in util_blitter_set_running_flag() argument
508 if (blitter->running) { in util_blitter_set_running_flag()
512 blitter->running = TRUE; in util_blitter_set_running_flag()
514 blitter->pipe->set_active_query_state(blitter->pipe, false); in util_blitter_set_running_flag()
517 void util_blitter_unset_running_flag(struct blitter_context *blitter) in util_blitter_unset_running_flag() argument
[all …]
/external/skia/src/core/
DSkScan.cpp24 static inline void blitrect(SkBlitter* blitter, const SkIRect& r) { in blitrect() argument
25 blitter->blitRect(r.fLeft, r.fTop, r.width(), r.height()); in blitrect()
29 SkBlitter* blitter) { in FillIRect() argument
36 blitrect(blitter, r); in FillIRect()
40 blitrect(blitter, rr); in FillIRect()
48 blitrect(blitter, rr); in FillIRect()
53 blitrect(blitter, r); in FillIRect()
59 SkBlitter* blitter) { in FillXRect() argument
63 SkScan::FillIRect(r, clip, blitter); in FillXRect()
67 SkBlitter* blitter) { in FillRect() argument
[all …]
DSkScan_Antihair.cpp67 static void call_hline_blitter(SkBlitter* blitter, int x, int y, int count, in call_hline_blitter() argument
82 blitter->blitAntiH(x, y, aa, runs); in call_hline_blitter()
95 void setup(SkBlitter* blitter) { in setup() argument
96 fBlitter = blitter; in setup()
171 SkBlitter* blitter = this->getBlitter(); in drawLine() local
175 blitter->blitAntiV2(x, lower_y - 1, 255 - a, a); in drawLine()
305 const SkIRect* clip, SkBlitter* blitter) { in do_anti_hairline() argument
329 do_anti_hairline(x0, y0, hx, hy, clip, blitter); in do_anti_hairline()
330 do_anti_hairline(hx, hy, x1, y1, clip, blitter); in do_anti_hairline()
497 rectClipper.init(blitter, *clip); in do_anti_hairline()
[all …]
DSkScan_Hairline.cpp17 SkBlitter* blitter) { in horiline() argument
21 blitter->blitH(x, fy >> 16, 1); in horiline()
27 SkBlitter* blitter) { in vertline() argument
31 blitter->blitH(fx >> 16, y, 1); in vertline()
57 SkBlitter* blitter = origBlitter; in HairLineRgn() local
104 blitter = clipper.apply(origBlitter, clip); in HairLineRgn()
125 horiline(ix0, ix1, startY, slope, blitter); in HairLineRgn()
140 vertline(iy0, iy1, startX, slope, blitter); in HairLineRgn()
148 SkBlitter* blitter) { in HairRect() argument
164 wrapper.init(clip, blitter); in HairRect()
[all …]
DSkScan_Path.cpp93 typedef void (*PrePostProc)(SkBlitter* blitter, int y, bool isStartOfScanline);
98 SkBlitter* blitter, int start_y, int stop_y, in walk_edges() argument
116 proc(blitter, curr_y, PREPOST_START); // pre-proc in walk_edges()
129 blitter->blitH(left, curr_y, width); in walk_edges()
173 blitter->blitH(left, curr_y, width); in walk_edges()
178 proc(blitter, curr_y, PREPOST_END); // post-proc in walk_edges()
211 SkBlitter* blitter, int start_y, int stop_y, in walk_convex_edges() argument
253 blitter->blitRect(L, local_top, R - L, count); in walk_convex_edges()
261 blitter->blitH(L, local_top, R - L); in walk_convex_edges()
311 void setBlitter(SkBlitter* blitter, const SkIRect& clip, int shift) { in setBlitter() argument
[all …]
DSkRasterPipelineBlitter.cpp148 auto blitter = alloc->make<SkRasterPipelineBlitter>(dst, in Create() local
156 auto colorPipeline = &blitter->fColorPipeline; in Create()
160 colorPipeline->append(SkRasterPipeline::load_f32, &blitter->fShaderOutput); in Create()
175 default: blitter->fDitherRate = 0.0f; break; in Create()
176 case kARGB_4444_SkColorType: blitter->fDitherRate = 1/15.0f; break; in Create()
177 case kRGB_565_SkColorType: blitter->fDitherRate = 1/63.0f; break; in Create()
181 case kBGRA_8888_SkColorType: blitter->fDitherRate = 1/255.0f; break; in Create()
183 case kRGBA_1010102_SkColorType: blitter->fDitherRate = 1/1023.0f; break; in Create()
189 is_constant = is_constant && (blitter->fDitherRate == 0.0f); in Create()
206 if (is_opaque && blitter->fBlend == SkBlendMode::kSrcOver) { in Create()
[all …]
DSkScan_AAAPath.cpp637 static SK_ALWAYS_INLINE void blit_single_alpha(AdditiveBlitter* blitter, int y, int x, in blit_single_alpha() argument
650 blitter->getRealBlitter()->blitV(x, y, 1, alpha); in blit_single_alpha()
652 blitter->blitAntiH(x, y, getPartialAlpha(alpha, fullAlpha)); in blit_single_alpha()
657 static SK_ALWAYS_INLINE void blit_two_alphas(AdditiveBlitter* blitter, int y, int x, in blit_two_alphas() argument
670 blitter->getRealBlitter()->blitAntiH2(x, y, a1, a2); in blit_two_alphas()
672 blitter->blitAntiH(x, y, a1); in blit_two_alphas()
673 blitter->blitAntiH(x + 1, y, a2); in blit_two_alphas()
679 static SK_ALWAYS_INLINE void blit_full_alpha(AdditiveBlitter* blitter, int y, int x, int len, in blit_full_alpha() argument
692 blitter->getRealBlitter()->blitH(x, y, len); in blit_full_alpha()
694 blitter->blitAntiH(x, y, len, fullAlpha); in blit_full_alpha()
[all …]
/external/skqp/src/core/
DSkScan.cpp24 static inline void blitrect(SkBlitter* blitter, const SkIRect& r) { in blitrect() argument
25 blitter->blitRect(r.fLeft, r.fTop, r.width(), r.height()); in blitrect()
29 SkBlitter* blitter) { in FillIRect() argument
36 blitrect(blitter, r); in FillIRect()
40 blitrect(blitter, rr); in FillIRect()
48 blitrect(blitter, rr); in FillIRect()
53 blitrect(blitter, r); in FillIRect()
59 SkBlitter* blitter) { in FillXRect() argument
63 SkScan::FillIRect(r, clip, blitter); in FillXRect()
67 SkBlitter* blitter) { in FillRect() argument
[all …]
DSkScan_Antihair.cpp67 static void call_hline_blitter(SkBlitter* blitter, int x, int y, int count, in call_hline_blitter() argument
82 blitter->blitAntiH(x, y, aa, runs); in call_hline_blitter()
95 void setup(SkBlitter* blitter) { in setup() argument
96 fBlitter = blitter; in setup()
171 SkBlitter* blitter = this->getBlitter(); in drawLine() local
175 blitter->blitAntiV2(x, lower_y - 1, 255 - a, a); in drawLine()
305 const SkIRect* clip, SkBlitter* blitter) { in do_anti_hairline() argument
329 do_anti_hairline(x0, y0, hx, hy, clip, blitter); in do_anti_hairline()
330 do_anti_hairline(hx, hy, x1, y1, clip, blitter); in do_anti_hairline()
497 rectClipper.init(blitter, *clip); in do_anti_hairline()
[all …]
DSkScan_Hairline.cpp17 SkBlitter* blitter) { in horiline() argument
21 blitter->blitH(x, fy >> 16, 1); in horiline()
27 SkBlitter* blitter) { in vertline() argument
31 blitter->blitH(fx >> 16, y, 1); in vertline()
57 SkBlitter* blitter = origBlitter; in HairLineRgn() local
104 blitter = clipper.apply(origBlitter, clip); in HairLineRgn()
125 horiline(ix0, ix1, startY, slope, blitter); in HairLineRgn()
140 vertline(iy0, iy1, startX, slope, blitter); in HairLineRgn()
148 SkBlitter* blitter) { in HairRect() argument
164 wrapper.init(clip, blitter); in HairRect()
[all …]
DSkScan_Path.cpp92 typedef void (*PrePostProc)(SkBlitter* blitter, int y, bool isStartOfScanline);
97 SkBlitter* blitter, int start_y, int stop_y, in walk_edges() argument
115 proc(blitter, curr_y, PREPOST_START); // pre-proc in walk_edges()
128 blitter->blitH(left, curr_y, width); in walk_edges()
172 blitter->blitH(left, curr_y, width); in walk_edges()
177 proc(blitter, curr_y, PREPOST_END); // post-proc in walk_edges()
210 SkBlitter* blitter, int start_y, int stop_y, in walk_convex_edges() argument
252 blitter->blitRect(L, local_top, R - L, count); in walk_convex_edges()
260 blitter->blitH(L, local_top, R - L); in walk_convex_edges()
306 void setBlitter(SkBlitter* blitter, const SkIRect& clip, int shift) { in setBlitter() argument
[all …]
DSkRasterPipelineBlitter.cpp148 auto blitter = alloc->make<SkRasterPipelineBlitter>(dst, in Create() local
156 auto colorPipeline = &blitter->fColorPipeline; in Create()
160 colorPipeline->append(SkRasterPipeline::load_f32, &blitter->fShaderOutput); in Create()
175 default: blitter->fDitherRate = 0.0f; break; in Create()
176 case kARGB_4444_SkColorType: blitter->fDitherRate = 1/15.0f; break; in Create()
177 case kRGB_565_SkColorType: blitter->fDitherRate = 1/63.0f; break; in Create()
181 case kBGRA_8888_SkColorType: blitter->fDitherRate = 1/255.0f; break; in Create()
183 case kRGBA_1010102_SkColorType: blitter->fDitherRate = 1/1023.0f; break; in Create()
189 is_constant = is_constant && (blitter->fDitherRate == 0.0f); in Create()
206 if (is_opaque && blitter->fBlend == SkBlendMode::kSrcOver) { in Create()
[all …]
DSkScan_AAAPath.cpp637 static SK_ALWAYS_INLINE void blit_single_alpha(AdditiveBlitter* blitter, int y, int x, in blit_single_alpha() argument
650 blitter->getRealBlitter()->blitV(x, y, 1, alpha); in blit_single_alpha()
652 blitter->blitAntiH(x, y, getPartialAlpha(alpha, fullAlpha)); in blit_single_alpha()
657 static SK_ALWAYS_INLINE void blit_two_alphas(AdditiveBlitter* blitter, int y, int x, in blit_two_alphas() argument
670 blitter->getRealBlitter()->blitAntiH2(x, y, a1, a2); in blit_two_alphas()
672 blitter->blitAntiH(x, y, a1); in blit_two_alphas()
673 blitter->blitAntiH(x + 1, y, a2); in blit_two_alphas()
679 static SK_ALWAYS_INLINE void blit_full_alpha(AdditiveBlitter* blitter, int y, int x, int len, in blit_full_alpha() argument
692 blitter->getRealBlitter()->blitH(x, y, len); in blit_full_alpha()
694 blitter->blitAntiH(x, y, len, fullAlpha); in blit_full_alpha()
[all …]
/external/mesa3d/src/gallium/drivers/softpipe/
Dsp_surface.c54 if (!util_blitter_is_blit_supported(sp->blitter, info)) { in sp_blit()
63 util_blitter_save_vertex_buffer_slot(sp->blitter, sp->vertex_buffer); in sp_blit()
64 util_blitter_save_vertex_elements(sp->blitter, sp->velems); in sp_blit()
65 util_blitter_save_vertex_shader(sp->blitter, sp->vs); in sp_blit()
66 util_blitter_save_geometry_shader(sp->blitter, sp->gs); in sp_blit()
67 util_blitter_save_so_targets(sp->blitter, sp->num_so_targets, in sp_blit()
69 util_blitter_save_rasterizer(sp->blitter, sp->rasterizer); in sp_blit()
70 util_blitter_save_viewport(sp->blitter, &sp->viewports[0]); in sp_blit()
71 util_blitter_save_scissor(sp->blitter, &sp->scissors[0]); in sp_blit()
72 util_blitter_save_fragment_shader(sp->blitter, sp->fs); in sp_blit()
[all …]
/external/mesa3d/src/gallium/drivers/llvmpipe/
Dlp_surface.c85 if (!util_blitter_is_blit_supported(lp->blitter, &info)) { in lp_blit()
94 util_blitter_save_vertex_buffer_slot(lp->blitter, lp->vertex_buffer); in lp_blit()
95 util_blitter_save_vertex_elements(lp->blitter, (void*)lp->velems); in lp_blit()
96 util_blitter_save_vertex_shader(lp->blitter, (void*)lp->vs); in lp_blit()
97 util_blitter_save_geometry_shader(lp->blitter, (void*)lp->gs); in lp_blit()
98 util_blitter_save_so_targets(lp->blitter, lp->num_so_targets, in lp_blit()
100 util_blitter_save_rasterizer(lp->blitter, (void*)lp->rasterizer); in lp_blit()
101 util_blitter_save_viewport(lp->blitter, &lp->viewports[0]); in lp_blit()
102 util_blitter_save_scissor(lp->blitter, &lp->scissors[0]); in lp_blit()
103 util_blitter_save_fragment_shader(lp->blitter, lp->fs); in lp_blit()
[all …]
/external/mesa3d/src/gallium/drivers/i915/
Di915_surface.c55 util_blitter_save_blend(i915->blitter, (void *)i915->blend); in i915_util_blitter_save_states()
56 util_blitter_save_depth_stencil_alpha(i915->blitter, (void *)i915->depth_stencil); in i915_util_blitter_save_states()
57 util_blitter_save_stencil_ref(i915->blitter, &i915->stencil_ref); in i915_util_blitter_save_states()
58 util_blitter_save_rasterizer(i915->blitter, (void *)i915->rasterizer); in i915_util_blitter_save_states()
59 util_blitter_save_fragment_shader(i915->blitter, i915->fs); in i915_util_blitter_save_states()
60 util_blitter_save_vertex_shader(i915->blitter, i915->vs); in i915_util_blitter_save_states()
61 util_blitter_save_viewport(i915->blitter, &i915->viewport); in i915_util_blitter_save_states()
62 util_blitter_save_scissor(i915->blitter, &i915->scissor); in i915_util_blitter_save_states()
63 util_blitter_save_vertex_elements(i915->blitter, i915->velems); in i915_util_blitter_save_states()
64 util_blitter_save_vertex_buffer_slot(i915->blitter, in i915_util_blitter_save_states()
[all …]
/external/mesa3d/src/gallium/drivers/vc4/
Dvc4_blit.c167 util_blitter_save_vertex_buffer_slot(vc4->blitter, vc4->vertexbuf.vb); in vc4_blitter_save()
168 util_blitter_save_vertex_elements(vc4->blitter, vc4->vtx); in vc4_blitter_save()
169 util_blitter_save_vertex_shader(vc4->blitter, vc4->prog.bind_vs); in vc4_blitter_save()
170 util_blitter_save_rasterizer(vc4->blitter, vc4->rasterizer); in vc4_blitter_save()
171 util_blitter_save_viewport(vc4->blitter, &vc4->viewport); in vc4_blitter_save()
172 util_blitter_save_scissor(vc4->blitter, &vc4->scissor); in vc4_blitter_save()
173 util_blitter_save_fragment_shader(vc4->blitter, vc4->prog.bind_fs); in vc4_blitter_save()
174 util_blitter_save_blend(vc4->blitter, vc4->blend); in vc4_blitter_save()
175 util_blitter_save_depth_stencil_alpha(vc4->blitter, vc4->zsa); in vc4_blitter_save()
176 util_blitter_save_stencil_ref(vc4->blitter, &vc4->stencil_ref); in vc4_blitter_save()
[all …]

12345