brw_state.c File Reference

Include dependency graph for brw_state.c:

Go to the source code of this file.

Defines

#define DUP(TYPE, VAL)

Functions

static void * brw_create_blend_state (struct pipe_context *pipe, const struct pipe_blend_state *blend)
static void brw_bind_blend_state (struct pipe_context *pipe, void *blend)
static void brw_delete_blend_state (struct pipe_context *pipe, void *blend)
static void brw_set_blend_color (struct pipe_context *pipe, const struct pipe_blend_color *blend_color)
static void * brw_create_sampler_state (struct pipe_context *pipe, const struct pipe_sampler_state *sampler)
static void brw_bind_sampler_states (struct pipe_context *pipe, unsigned num, void **sampler)
static void brw_delete_sampler_state (struct pipe_context *pipe, void *sampler)
static void * brw_create_depth_stencil_state (struct pipe_context *pipe, const struct pipe_depth_stencil_alpha_state *depth_stencil)
static void brw_bind_depth_stencil_state (struct pipe_context *pipe, void *depth_stencil)
static void brw_delete_depth_stencil_state (struct pipe_context *pipe, void *depth_stencil)
static void brw_set_scissor_state (struct pipe_context *pipe, const struct pipe_scissor_state *scissor)
static void brw_set_polygon_stipple (struct pipe_context *pipe, const struct pipe_poly_stipple *stipple)
static void * brw_create_fs_state (struct pipe_context *pipe, const struct pipe_shader_state *shader)
static void brw_bind_fs_state (struct pipe_context *pipe, void *shader)
static void brw_delete_fs_state (struct pipe_context *pipe, void *shader)
static void * brw_create_vs_state (struct pipe_context *pipe, const struct pipe_shader_state *shader)
static void brw_bind_vs_state (struct pipe_context *pipe, void *vs)
static void brw_delete_vs_state (struct pipe_context *pipe, void *shader)
static void brw_set_clip_state (struct pipe_context *pipe, const struct pipe_clip_state *clip)
static void brw_set_viewport_state (struct pipe_context *pipe, const struct pipe_viewport_state *viewport)
static void brw_set_vertex_buffers (struct pipe_context *pipe, unsigned count, const struct pipe_vertex_buffer *buffers)
static void brw_set_vertex_elements (struct pipe_context *pipe, unsigned count, const struct pipe_vertex_element *elements)
static void brw_set_constant_buffer (struct pipe_context *pipe, uint shader, uint index, const struct pipe_constant_buffer *buf)
static void brw_set_sampler_textures (struct pipe_context *pipe, unsigned num, struct pipe_texture **texture)
static void brw_set_framebuffer_state (struct pipe_context *pipe, const struct pipe_framebuffer_state *fb)
static void * brw_create_rasterizer_state (struct pipe_context *pipe, const struct pipe_rasterizer_state *rasterizer)
static void brw_bind_rasterizer_state (struct pipe_context *pipe, void *setup)
static void brw_delete_rasterizer_state (struct pipe_context *pipe, void *setup)
void brw_init_state_functions (struct brw_context *brw)


Define Documentation

#define DUP ( TYPE,
VAL   ) 

Value:

do {                                            \
   struct TYPE *x = malloc(sizeof(*x));         \
   memcpy(x, VAL, sizeof(*x) );                 \
   return x;                                    \
} while (0)

Definition at line 46 of file brw_state.c.


Function Documentation

static void brw_bind_blend_state ( struct pipe_context pipe,
void *  blend 
) [static]

Definition at line 63 of file brw_state.c.

References brw_context::attribs, brw_context::Blend, brw_state_flags::brw, brw_context(), BRW_NEW_BLEND, brw_context::dirty, and brw_context::state.

00065 {
00066    struct brw_context *brw = brw_context(pipe);
00067 
00068    brw->attribs.Blend = (struct pipe_blend_state*)blend;
00069    brw->state.dirty.brw |= BRW_NEW_BLEND;
00070 }

static void brw_bind_depth_stencil_state ( struct pipe_context pipe,
void *  depth_stencil 
) [static]

Definition at line 138 of file brw_state.c.

References brw_context::attribs, brw_state_flags::brw, brw_context(), BRW_NEW_DEPTH_STENCIL, brw_context::DepthStencil, brw_context::dirty, and brw_context::state.

00140 {
00141    struct brw_context *brw = brw_context(pipe);
00142 
00143    brw->attribs.DepthStencil = (const struct pipe_depth_stencil_alpha_state *)depth_stencil;
00144 
00145    brw->state.dirty.brw |= BRW_NEW_DEPTH_STENCIL;
00146 }

static void brw_bind_fs_state ( struct pipe_context pipe,
void *  shader 
) [static]

Definition at line 202 of file brw_state.c.

References brw_context::attribs, brw_state_flags::brw, brw_context(), BRW_NEW_FS, brw_context::dirty, brw_context::FragmentProgram, and brw_context::state.

00203 {
00204    struct brw_context *brw = brw_context(pipe);
00205 
00206    brw->attribs.FragmentProgram = (struct brw_fragment_program *)shader;
00207    brw->state.dirty.brw |= BRW_NEW_FS;
00208 }

static void brw_bind_rasterizer_state ( struct pipe_context pipe,
void *  setup 
) [static]

Definition at line 408 of file brw_state.c.

References brw_context::attribs, brw_state_flags::brw, brw_context(), BRW_NEW_RASTERIZER, brw_context::dirty, brw_context::Raster, and brw_context::state.

00410 {
00411    struct brw_context *brw = brw_context(pipe);
00412 
00413    brw->attribs.Raster = (struct pipe_rasterizer_state *)setup;
00414 
00415    /* Also pass-through to draw module:
00416     */
00417    //draw_set_rasterizer_state(brw->draw, setup);
00418 
00419    brw->state.dirty.brw |= BRW_NEW_RASTERIZER;
00420 }

static void brw_bind_sampler_states ( struct pipe_context pipe,
unsigned  num,
void **  sampler 
) [static]

Definition at line 99 of file brw_state.c.

References assert, brw_context::attribs, brw_state_flags::brw, brw_context(), BRW_NEW_SAMPLER, brw_context::dirty, brw_context::num_samplers, PIPE_MAX_SAMPLERS, brw_context::Samplers, and brw_context::state.

00101 {
00102    struct brw_context *brw = brw_context(pipe);
00103 
00104    assert(num <= PIPE_MAX_SAMPLERS);
00105 
00106    /* Check for no-op */
00107    if (num == brw->num_samplers &&
00108        !memcmp(brw->attribs.Samplers, sampler, num * sizeof(void *)))
00109       return;
00110 
00111    memcpy(brw->attribs.Samplers, sampler, num * sizeof(void *));
00112    memset(&brw->attribs.Samplers[num], 0, (PIPE_MAX_SAMPLERS - num) *
00113           sizeof(void *));
00114 
00115    brw->num_samplers = num;
00116 
00117    brw->state.dirty.brw |= BRW_NEW_SAMPLER;
00118 }

static void brw_bind_vs_state ( struct pipe_context pipe,
void *  vs 
) [static]

Definition at line 242 of file brw_state.c.

References brw_context::attribs, brw_state_flags::brw, brw_context(), BRW_NEW_VS, debug_printf(), brw_context::dirty, brw_context::state, and brw_context::VertexProgram.

00243 {
00244    struct brw_context *brw = brw_context(pipe);
00245 
00246    brw->attribs.VertexProgram = (struct brw_vertex_program *)vs;
00247    brw->state.dirty.brw |= BRW_NEW_VS;
00248 
00249    debug_printf("YYYYYYYYYYYYY BINDING VERTEX SHADER\n");
00250 }

static void* brw_create_blend_state ( struct pipe_context pipe,
const struct pipe_blend_state blend 
) [static]

Definition at line 57 of file brw_state.c.

References DUP.

00059 {   
00060    DUP( pipe_blend_state, blend );
00061 }

static void* brw_create_depth_stencil_state ( struct pipe_context pipe,
const struct pipe_depth_stencil_alpha_state depth_stencil 
) [static]

Definition at line 132 of file brw_state.c.

References DUP.

00134 {
00135    DUP( pipe_depth_stencil_alpha_state, depth_stencil );
00136 }

static void* brw_create_fs_state ( struct pipe_context pipe,
const struct pipe_shader_state shader 
) [static]

Definition at line 181 of file brw_state.c.

References brw_context(), brw_shader_info(), CALLOC_STRUCT, brw_fragment_program::id, brw_fragment_program::info, brw_fragment_program::program, brw_context::program_id, tgsi_dump(), tgsi_dup_tokens(), tgsi_scan_shader(), and pipe_shader_state::tokens.

00183 {
00184    struct brw_fragment_program *brw_fp = CALLOC_STRUCT(brw_fragment_program);
00185 
00186    brw_fp->program.tokens = tgsi_dup_tokens(shader->tokens);
00187    brw_fp->id = brw_context(pipe)->program_id++;
00188 
00189    tgsi_scan_shader(shader->tokens, &brw_fp->info);
00190 
00191 #if 0
00192    brw_shader_info(shader->tokens,
00193                    &brw_fp->info2);
00194 #endif
00195 
00196    tgsi_dump(shader->tokens, 0);
00197 
00198 
00199    return (void *)brw_fp;
00200 }

static void* brw_create_rasterizer_state ( struct pipe_context pipe,
const struct pipe_rasterizer_state rasterizer 
) [static]

Definition at line 402 of file brw_state.c.

References DUP.

00404 {
00405    DUP(pipe_rasterizer_state, rasterizer);
00406 }

static void* brw_create_sampler_state ( struct pipe_context pipe,
const struct pipe_sampler_state sampler 
) [static]

Definition at line 93 of file brw_state.c.

References DUP.

00095 {
00096    DUP( pipe_sampler_state, sampler );
00097 }

static void* brw_create_vs_state ( struct pipe_context pipe,
const struct pipe_shader_state shader 
) [static]

Definition at line 223 of file brw_state.c.

References brw_context(), brw_shader_info(), CALLOC_STRUCT, brw_vertex_program::id, brw_vertex_program::info, brw_vertex_program::program, brw_context::program_id, tgsi_dump(), tgsi_dup_tokens(), tgsi_scan_shader(), and pipe_shader_state::tokens.

00225 {
00226    struct brw_vertex_program *brw_vp = CALLOC_STRUCT(brw_vertex_program);
00227 
00228    brw_vp->program.tokens = tgsi_dup_tokens(shader->tokens);
00229    brw_vp->id = brw_context(pipe)->program_id++;
00230 
00231    tgsi_scan_shader(shader->tokens, &brw_vp->info);
00232 
00233 #if 0
00234    brw_shader_info(shader->tokens,
00235                    &brw_vp->info2);
00236 #endif
00237    tgsi_dump(shader->tokens, 0);
00238 
00239    return (void *)brw_vp;
00240 }

static void brw_delete_blend_state ( struct pipe_context pipe,
void *  blend 
) [static]

Definition at line 73 of file brw_state.c.

00074 {
00075    free(blend);
00076 }

static void brw_delete_depth_stencil_state ( struct pipe_context pipe,
void *  depth_stencil 
) [static]

Definition at line 148 of file brw_state.c.

00150 {
00151    free(depth_stencil);
00152 }

static void brw_delete_fs_state ( struct pipe_context pipe,
void *  shader 
) [static]

Definition at line 210 of file brw_state.c.

References FREE, brw_fragment_program::program, and pipe_shader_state::tokens.

00211 {
00212    struct brw_fragment_program *brw_fp = (struct brw_fragment_program *) shader;
00213 
00214    FREE((void *) brw_fp->program.tokens);
00215    FREE(brw_fp);
00216 }

static void brw_delete_rasterizer_state ( struct pipe_context pipe,
void *  setup 
) [static]

Definition at line 422 of file brw_state.c.

00424 {
00425    free(setup);
00426 }

static void brw_delete_sampler_state ( struct pipe_context pipe,
void *  sampler 
) [static]

Definition at line 120 of file brw_state.c.

00122 {
00123    free(sampler);
00124 }

static void brw_delete_vs_state ( struct pipe_context pipe,
void *  shader 
) [static]

Definition at line 252 of file brw_state.c.

References FREE, brw_vertex_program::program, and pipe_shader_state::tokens.

00253 {
00254    struct brw_vertex_program *brw_vp = (struct brw_vertex_program *) shader;
00255 
00256    FREE((void *) brw_vp->program.tokens);
00257    FREE(brw_vp);
00258 }

void brw_init_state_functions ( struct brw_context brw  ) 

Definition at line 431 of file brw_state.c.

References pipe_context::bind_blend_state, pipe_context::bind_depth_stencil_alpha_state, pipe_context::bind_fs_state, pipe_context::bind_rasterizer_state, pipe_context::bind_sampler_states, pipe_context::bind_vs_state, brw_bind_blend_state(), brw_bind_depth_stencil_state(), brw_bind_fs_state(), brw_bind_rasterizer_state(), brw_bind_sampler_states(), brw_bind_vs_state(), brw_create_blend_state(), brw_create_depth_stencil_state(), brw_create_fs_state(), brw_create_rasterizer_state(), brw_create_sampler_state(), brw_create_vs_state(), brw_delete_blend_state(), brw_delete_depth_stencil_state(), brw_delete_fs_state(), brw_delete_rasterizer_state(), brw_delete_sampler_state(), brw_delete_vs_state(), brw_set_blend_color(), brw_set_clip_state(), brw_set_constant_buffer(), brw_set_framebuffer_state(), brw_set_polygon_stipple(), brw_set_sampler_textures(), brw_set_scissor_state(), brw_set_vertex_buffers(), brw_set_vertex_elements(), brw_set_viewport_state(), pipe_context::create_blend_state, pipe_context::create_depth_stencil_alpha_state, pipe_context::create_fs_state, pipe_context::create_rasterizer_state, pipe_context::create_sampler_state, pipe_context::create_vs_state, pipe_context::delete_blend_state, pipe_context::delete_depth_stencil_alpha_state, pipe_context::delete_fs_state, pipe_context::delete_rasterizer_state, pipe_context::delete_sampler_state, pipe_context::delete_vs_state, brw_context::pipe, pipe_context::set_blend_color, pipe_context::set_clip_state, pipe_context::set_constant_buffer, pipe_context::set_framebuffer_state, pipe_context::set_polygon_stipple, pipe_context::set_sampler_textures, pipe_context::set_scissor_state, pipe_context::set_vertex_buffers, pipe_context::set_vertex_elements, and pipe_context::set_viewport_state.

00432 {
00433    brw->pipe.create_blend_state = brw_create_blend_state;
00434    brw->pipe.bind_blend_state = brw_bind_blend_state;
00435    brw->pipe.delete_blend_state = brw_delete_blend_state;
00436 
00437    brw->pipe.create_sampler_state = brw_create_sampler_state;
00438    brw->pipe.bind_sampler_states = brw_bind_sampler_states;
00439    brw->pipe.delete_sampler_state = brw_delete_sampler_state;
00440 
00441    brw->pipe.create_depth_stencil_alpha_state = brw_create_depth_stencil_state;
00442    brw->pipe.bind_depth_stencil_alpha_state = brw_bind_depth_stencil_state;
00443    brw->pipe.delete_depth_stencil_alpha_state = brw_delete_depth_stencil_state;
00444 
00445    brw->pipe.create_rasterizer_state = brw_create_rasterizer_state;
00446    brw->pipe.bind_rasterizer_state = brw_bind_rasterizer_state;
00447    brw->pipe.delete_rasterizer_state = brw_delete_rasterizer_state;
00448    brw->pipe.create_fs_state = brw_create_fs_state;
00449    brw->pipe.bind_fs_state = brw_bind_fs_state;
00450    brw->pipe.delete_fs_state = brw_delete_fs_state;
00451    brw->pipe.create_vs_state = brw_create_vs_state;
00452    brw->pipe.bind_vs_state = brw_bind_vs_state;
00453    brw->pipe.delete_vs_state = brw_delete_vs_state;
00454 
00455    brw->pipe.set_blend_color = brw_set_blend_color;
00456    brw->pipe.set_clip_state = brw_set_clip_state;
00457    brw->pipe.set_constant_buffer = brw_set_constant_buffer;
00458    brw->pipe.set_framebuffer_state = brw_set_framebuffer_state;
00459 
00460 //   brw->pipe.set_feedback_state = brw_set_feedback_state;
00461 //   brw->pipe.set_feedback_buffer = brw_set_feedback_buffer;
00462 
00463    brw->pipe.set_polygon_stipple = brw_set_polygon_stipple;
00464    brw->pipe.set_scissor_state = brw_set_scissor_state;
00465    brw->pipe.set_sampler_textures = brw_set_sampler_textures;
00466    brw->pipe.set_viewport_state = brw_set_viewport_state;
00467    brw->pipe.set_vertex_buffers = brw_set_vertex_buffers;
00468    brw->pipe.set_vertex_elements = brw_set_vertex_elements;
00469 }

static void brw_set_blend_color ( struct pipe_context pipe,
const struct pipe_blend_color blend_color 
) [static]

Definition at line 78 of file brw_state.c.

References brw_context::attribs, brw_context::BlendColor, brw_state_flags::brw, brw_context(), BRW_NEW_BLEND, brw_context::dirty, and brw_context::state.

00080 {
00081    struct brw_context *brw = brw_context(pipe);
00082 
00083    brw->attribs.BlendColor = *blend_color;
00084 
00085    brw->state.dirty.brw |= BRW_NEW_BLEND;
00086 }

static void brw_set_clip_state ( struct pipe_context pipe,
const struct pipe_clip_state clip 
) [static]

Definition at line 261 of file brw_state.c.

References brw_context::attribs, brw_context(), and brw_context::Clip.

00263 {
00264    struct brw_context *brw = brw_context(pipe);
00265 
00266    brw->attribs.Clip = *clip;
00267 }

static void brw_set_constant_buffer ( struct pipe_context pipe,
uint  shader,
uint  index,
const struct pipe_constant_buffer buf 
) [static]

Definition at line 334 of file brw_state.c.

References assert, brw_context::attribs, brw_state_flags::brw, brw_context(), BRW_NEW_CONSTANTS, brw_context::Constants, brw_context::dirty, and brw_context::state.

00337 {
00338    struct brw_context *brw = brw_context(pipe);
00339 
00340    assert(buf == 0 || index == 0);
00341 
00342    brw->attribs.Constants[shader] = buf;
00343    brw->state.dirty.brw |= BRW_NEW_CONSTANTS;
00344 }

static void brw_set_framebuffer_state ( struct pipe_context pipe,
const struct pipe_framebuffer_state fb 
) [static]

Definition at line 385 of file brw_state.c.

References brw_context::attribs, brw_state_flags::brw, brw_context(), BRW_NEW_FRAMEBUFFER, brw_context::dirty, brw_context::FrameBuffer, and brw_context::state.

00387 {
00388    struct brw_context *brw = brw_context(pipe);
00389 
00390    brw->attribs.FrameBuffer = *fb; /* struct copy */
00391 
00392    brw->state.dirty.brw |= BRW_NEW_FRAMEBUFFER;
00393 }

static void brw_set_polygon_stipple ( struct pipe_context pipe,
const struct pipe_poly_stipple stipple 
) [static]

Definition at line 171 of file brw_state.c.

00173 {
00174 }

static void brw_set_sampler_textures ( struct pipe_context pipe,
unsigned  num,
struct pipe_texture **  texture 
) [static]

Definition at line 352 of file brw_state.c.

References assert, brw_context::attribs, brw_state_flags::brw, brw_context(), BRW_NEW_TEXTURE, brw_context::dirty, brw_context::num_textures, PIPE_MAX_SAMPLERS, pipe_texture_reference(), brw_context::state, and brw_context::Texture.

00355 {
00356    struct brw_context *brw = brw_context(pipe);
00357    uint i;
00358 
00359    assert(num <= PIPE_MAX_SAMPLERS);
00360 
00361    /* Check for no-op */
00362    if (num == brw->num_textures &&
00363        !memcmp(brw->attribs.Texture, texture, num *
00364                sizeof(struct pipe_texture *)))
00365       return;
00366 
00367    for (i = 0; i < num; i++)
00368       pipe_texture_reference((struct pipe_texture **) &brw->attribs.Texture[i],
00369                              texture[i]);
00370 
00371    for (i = num; i < brw->num_textures; i++)
00372       pipe_texture_reference((struct pipe_texture **) &brw->attribs.Texture[i],
00373                              NULL);
00374 
00375    brw->num_textures = num;
00376 
00377    brw->state.dirty.brw |= BRW_NEW_TEXTURE;
00378 }

static void brw_set_scissor_state ( struct pipe_context pipe,
const struct pipe_scissor_state scissor 
) [static]

Definition at line 157 of file brw_state.c.

References brw_context::attribs, brw_state_flags::brw, brw_context(), BRW_NEW_SCISSOR, brw_context::dirty, brw_context::Scissor, and brw_context::state.

00159 {
00160    struct brw_context *brw = brw_context(pipe);
00161 
00162    memcpy( &brw->attribs.Scissor, scissor, sizeof(*scissor) );
00163    brw->state.dirty.brw |= BRW_NEW_SCISSOR;
00164 }

static void brw_set_vertex_buffers ( struct pipe_context pipe,
unsigned  count,
const struct pipe_vertex_buffer buffers 
) [static]

Definition at line 283 of file brw_state.c.

References brw_context(), brw_context::vb, and brw_context::vbo_array.

00286 {
00287    struct brw_context *brw = brw_context(pipe);
00288    memcpy(brw->vb.vbo_array, buffers, count * sizeof(buffers[0]));
00289 }

static void brw_set_vertex_elements ( struct pipe_context pipe,
unsigned  count,
const struct pipe_vertex_element elements 
) [static]

Definition at line 291 of file brw_state.c.

References assert, brw_context(), brw_translate_surface_format(), BRW_VFCOMPONENT_STORE_0, BRW_VFCOMPONENT_STORE_1_FLT, BRW_VFCOMPONENT_STORE_SRC, brw_vertex_element_state::dst_offset, brw_context::inputs, PIPE_MAX_ATTRIBS, brw_vertex_element_state::src_format, pipe_vertex_element::src_offset, brw_vertex_element_state::src_offset, brw_vertex_element_state::valid, brw_context::vb, brw_vertex_element_state::ve0, brw_vertex_element_state::ve1, pipe_vertex_element::vertex_buffer_index, brw_vertex_element_state::vertex_buffer_index, brw_vertex_element_state::vfcomponent0, brw_vertex_element_state::vfcomponent1, brw_vertex_element_state::vfcomponent2, and brw_vertex_element_state::vfcomponent3.

00294 {
00295    /* flush ? */
00296    struct brw_context *brw = brw_context(pipe);
00297    uint i;
00298 
00299    assert(count <= PIPE_MAX_ATTRIBS);
00300 
00301    for (i = 0; i < count; i++) {
00302       struct brw_vertex_element_state el;
00303       memset(&el, 0, sizeof(el));
00304 
00305       el.ve0.src_offset = elements[i].src_offset;
00306       el.ve0.src_format = brw_translate_surface_format(elements[i].src_format);
00307       el.ve0.valid = 1;
00308       el.ve0.vertex_buffer_index = elements[i].vertex_buffer_index;
00309 
00310       el.ve1.dst_offset   = i * 4;
00311 
00312       el.ve1.vfcomponent3 = BRW_VFCOMPONENT_STORE_SRC;
00313       el.ve1.vfcomponent2 = BRW_VFCOMPONENT_STORE_SRC;
00314       el.ve1.vfcomponent1 = BRW_VFCOMPONENT_STORE_SRC;
00315       el.ve1.vfcomponent0 = BRW_VFCOMPONENT_STORE_SRC;
00316 
00317       switch (elements[i].nr_components) {
00318       case 1: el.ve1.vfcomponent1 = BRW_VFCOMPONENT_STORE_0;
00319       case 2: el.ve1.vfcomponent2 = BRW_VFCOMPONENT_STORE_0;
00320       case 3: el.ve1.vfcomponent3 = BRW_VFCOMPONENT_STORE_1_FLT;
00321          break;
00322       }
00323 
00324       brw->vb.inputs[i] = el;
00325    }
00326 }

static void brw_set_viewport_state ( struct pipe_context pipe,
const struct pipe_viewport_state viewport 
) [static]

Definition at line 270 of file brw_state.c.

References brw_context::attribs, brw_state_flags::brw, brw_context(), BRW_NEW_VIEWPORT, brw_context::dirty, brw_context::state, and brw_context::Viewport.

00272 {
00273    struct brw_context *brw = brw_context(pipe);
00274 
00275    brw->attribs.Viewport = *viewport; /* struct copy */
00276    brw->state.dirty.brw |= BRW_NEW_VIEWPORT;
00277 
00278    /* pass the viewport info to the draw module */
00279    //draw_set_viewport_state(brw->draw, viewport);
00280 }


Generated on Tue Sep 29 06:25:38 2009 for Gallium3D by  doxygen 1.5.4