winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
January
2003
December
November
October
September
August
July
June
May
April
March
February
January
2002
December
November
October
September
August
July
June
May
April
March
February
January
2001
December
November
October
September
August
July
June
May
April
March
February
List overview
wine-commits
March 2020
----- 2025 -----
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
1 participants
996 discussions
Start a n
N
ew thread
Zebediah Figura : d3dcompiler: Move some declarations to bytecodewriter.c.
by Alexandre Julliard
27 Mar '20
27 Mar '20
Module: wine Branch: master Commit: 810d385b9e8a62da644cd6a9179e7249b45f48a1 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=810d385b9e8a62da644cd6a9…
Author: Zebediah Figura <z.figura12(a)gmail.com> Date: Wed Mar 25 23:29:04 2020 -0500 d3dcompiler: Move some declarations to bytecodewriter.c. Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com> Signed-off-by: Matteo Bruni <mbruni(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/d3dcompiler_43/bytecodewriter.c | 46 ++++++++++++++++++++++++++ dlls/d3dcompiler_43/d3dcompiler_private.h | 55 ------------------------------- 2 files changed, 46 insertions(+), 55 deletions(-) diff --git a/dlls/d3dcompiler_43/bytecodewriter.c b/dlls/d3dcompiler_43/bytecodewriter.c index 8374a8d030..d5e55e2c4e 100644 --- a/dlls/d3dcompiler_43/bytecodewriter.c +++ b/dlls/d3dcompiler_43/bytecodewriter.c @@ -308,6 +308,52 @@ BOOL record_sampler(struct bwriter_shader *shader, DWORD samptype, DWORD mod, DW return TRUE; } +struct bytecode_buffer +{ + DWORD *data; + unsigned int size, alloc_size; + HRESULT state; +}; + +struct bc_writer; + +typedef void (*instr_writer)(struct bc_writer *writer, const struct instruction *instr, + struct bytecode_buffer *buffer); + +struct bytecode_backend +{ + void (*header)(struct bc_writer *writer, const struct bwriter_shader *shader, + struct bytecode_buffer *buffer); + void (*end)(struct bc_writer *writer, const struct bwriter_shader *shader, + struct bytecode_buffer *buffer); + void (*srcreg)(struct bc_writer *writer, const struct shader_reg *reg, + struct bytecode_buffer *buffer); + void (*dstreg)(struct bc_writer *writer, const struct shader_reg *reg, + struct bytecode_buffer *buffer, DWORD shift, DWORD mod); + void (*opcode)(struct bc_writer *writer, const struct instruction *instr, + DWORD token, struct bytecode_buffer *buffer); + + const struct instr_handler_table + { + DWORD opcode; + instr_writer func; + } *instructions; +}; + +struct bc_writer +{ + const struct bytecode_backend *funcs; + const struct bwriter_shader *shader; + + HRESULT state; + + /* Vertex shader varying mapping. */ + DWORD oPos_regnum, oD_regnum[2], oT_regnum[8], oFog_regnum, oFog_mask, oPts_regnum, oPts_mask; + + /* Pixel shader varying mapping. */ + DWORD t_regnum[8], v_regnum[2]; +}; + /* shader bytecode buffer manipulation functions. * allocate_buffer creates a new buffer structure, put_dword adds a new diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h index ee9e705d75..2a92628212 100644 --- a/dlls/d3dcompiler_43/d3dcompiler_private.h +++ b/dlls/d3dcompiler_43/d3dcompiler_private.h @@ -294,61 +294,6 @@ static inline void set_parse_status(enum parse_status *current, enum parse_statu *current = PARSE_WARN; } -struct bytecode_buffer { - DWORD *data; - unsigned int size, alloc_size; - /* For tracking rare out of memory situations without passing - * return values around everywhere - */ - HRESULT state; -}; - -struct bc_writer; /* Predeclaration for use in vtable parameters */ - -typedef void (*instr_writer)(struct bc_writer *This, - const struct instruction *instr, - struct bytecode_buffer *buffer); - -struct bytecode_backend { - void (*header)(struct bc_writer *This, const struct bwriter_shader *shader, - struct bytecode_buffer *buffer); - void (*end)(struct bc_writer *This, const struct bwriter_shader *shader, - struct bytecode_buffer *buffer); - void (*srcreg)(struct bc_writer *This, const struct shader_reg *reg, - struct bytecode_buffer *buffer); - void (*dstreg)(struct bc_writer *This, const struct shader_reg *reg, - struct bytecode_buffer *buffer, DWORD shift, DWORD mod); - void (*opcode)(struct bc_writer *This, const struct instruction *instr, - DWORD token, struct bytecode_buffer *buffer); - - const struct instr_handler_table { - DWORD opcode; - instr_writer func; - } *instructions; -}; - -/* Bytecode writing stuff */ -struct bc_writer { - const struct bytecode_backend *funcs; - const struct bwriter_shader *shader; - - /* Avoid result checking */ - HRESULT state; - - /* Vertex shader varying mapping */ - DWORD oPos_regnum; - DWORD oD_regnum[2]; - DWORD oT_regnum[8]; - DWORD oFog_regnum; - DWORD oFog_mask; - DWORD oPts_regnum; - DWORD oPts_mask; - - /* Pixel shader specific members */ - DWORD t_regnum[8]; - DWORD v_regnum[2]; -}; - /* Debug utility routines */ const char *debug_print_srcmod(DWORD mod) DECLSPEC_HIDDEN; const char *debug_print_dstmod(DWORD mod) DECLSPEC_HIDDEN;
1
0
0
0
Zebediah Figura : d3dcompiler: Introduce an array_reserve() helper.
by Alexandre Julliard
27 Mar '20
27 Mar '20
Module: wine Branch: master Commit: cbb4a86218b9b00cfe48c5b392591eb012e8ece8 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=cbb4a86218b9b00cfe48c5b3…
Author: Zebediah Figura <z.figura12(a)gmail.com> Date: Wed Mar 25 23:29:03 2020 -0500 d3dcompiler: Introduce an array_reserve() helper. Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com> Signed-off-by: Matteo Bruni <mbruni(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/d3dcompiler_43/bytecodewriter.c | 75 +++++++++++++++---------------- dlls/d3dcompiler_43/d3dcompiler_private.h | 8 ++-- 2 files changed, 39 insertions(+), 44 deletions(-) diff --git a/dlls/d3dcompiler_43/bytecodewriter.c b/dlls/d3dcompiler_43/bytecodewriter.c index 39ab6a5ccc..8374a8d030 100644 --- a/dlls/d3dcompiler_43/bytecodewriter.c +++ b/dlls/d3dcompiler_43/bytecodewriter.c @@ -27,6 +27,35 @@ WINE_DEFAULT_DEBUG_CHANNEL(bytecodewriter); +static BOOL array_reserve(void **elements, unsigned int *capacity, unsigned int count, unsigned int size) +{ + unsigned int max_capacity, new_capacity; + void *new_elements; + + if (count <= *capacity) + return TRUE; + + max_capacity = ~0u / size; + if (count > max_capacity) + return FALSE; + + new_capacity = max(8, *capacity); + while (new_capacity < count && new_capacity <= max_capacity / 2) + new_capacity *= 2; + if (new_capacity < count) + new_capacity = count; + + if (!(new_elements = d3dcompiler_realloc(*elements, new_capacity * size))) + { + ERR("Failed to allocate memory.\n"); + return FALSE; + } + + *elements = new_elements; + *capacity = new_capacity; + return TRUE; +} + /**************************************************************** * General assembler shader construction helper routines follow * ****************************************************************/ @@ -73,30 +102,11 @@ struct instruction *alloc_instr(unsigned int srcs) { * instr: Instruction to add to the shader */ BOOL add_instruction(struct bwriter_shader *shader, struct instruction *instr) { - struct instruction **new_instructions; - if(!shader) return FALSE; - if(shader->instr_alloc_size == 0) { - shader->instr = d3dcompiler_alloc(sizeof(*shader->instr) * INSTRARRAY_INITIAL_SIZE); - if(!shader->instr) { - ERR("Failed to allocate the shader instruction array\n"); - return FALSE; - } - shader->instr_alloc_size = INSTRARRAY_INITIAL_SIZE; - } else if(shader->instr_alloc_size == shader->num_instrs) { - new_instructions = d3dcompiler_realloc(shader->instr, - sizeof(*shader->instr) * (shader->instr_alloc_size) * 2); - if(!new_instructions) { - ERR("Failed to grow the shader instruction array\n"); - return FALSE; - } - shader->instr = new_instructions; - shader->instr_alloc_size = shader->instr_alloc_size * 2; - } else if(shader->num_instrs > shader->instr_alloc_size) { - ERR("More instructions than allocated. This should not happen\n"); + if (!array_reserve((void **)&shader->instr, &shader->instr_alloc_size, + shader->num_instrs + 1, sizeof(*shader->instr))) return FALSE; - } shader->instr[shader->num_instrs] = instr; shader->num_instrs++; @@ -310,13 +320,6 @@ static struct bytecode_buffer *allocate_buffer(void) { ret = d3dcompiler_alloc(sizeof(*ret)); if(!ret) return NULL; - - ret->alloc_size = BYTECODEBUFFER_INITIAL_SIZE; - ret->data = d3dcompiler_alloc(sizeof(DWORD) * ret->alloc_size); - if(!ret->data) { - d3dcompiler_free(ret); - return NULL; - } ret->state = S_OK; return ret; } @@ -324,18 +327,12 @@ static struct bytecode_buffer *allocate_buffer(void) { static void put_dword(struct bytecode_buffer *buffer, DWORD value) { if(FAILED(buffer->state)) return; - if(buffer->alloc_size == buffer->size) { - DWORD *newarray; - buffer->alloc_size *= 2; - newarray = d3dcompiler_realloc(buffer->data, - sizeof(DWORD) * buffer->alloc_size); - if(!newarray) { - ERR("Failed to grow the buffer data memory\n"); - buffer->state = E_OUTOFMEMORY; - return; - } - buffer->data = newarray; + if (!array_reserve((void **)&buffer->data, &buffer->alloc_size, buffer->size + 1, sizeof(*buffer->data))) + { + buffer->state = E_OUTOFMEMORY; + return; } + buffer->data[buffer->size++] = value; } diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h index b9caf59580..ee9e705d75 100644 --- a/dlls/d3dcompiler_43/d3dcompiler_private.h +++ b/dlls/d3dcompiler_43/d3dcompiler_private.h @@ -115,7 +115,6 @@ struct samplerdecl { DWORD mod; }; -#define INSTRARRAY_INITIAL_SIZE 8 struct bwriter_shader { enum shader_type type; unsigned char major_version, minor_version; @@ -149,6 +148,8 @@ static inline void *d3dcompiler_alloc(SIZE_T size) static inline void *d3dcompiler_realloc(void *ptr, SIZE_T size) { + if (!ptr) + return d3dcompiler_alloc(size); return HeapReAlloc(GetProcessHeap(), 0, ptr, size); } @@ -293,12 +294,9 @@ static inline void set_parse_status(enum parse_status *current, enum parse_statu *current = PARSE_WARN; } -/* A reasonable value as initial size */ -#define BYTECODEBUFFER_INITIAL_SIZE 32 struct bytecode_buffer { DWORD *data; - DWORD size; - DWORD alloc_size; + unsigned int size, alloc_size; /* For tracking rare out of memory situations without passing * return values around everywhere */
1
0
0
0
Zebediah Figura : d3dcompiler: Get rid of the "len" parameter to write_declarations().
by Alexandre Julliard
27 Mar '20
27 Mar '20
Module: wine Branch: master Commit: 5ba51ef26cb7d47d5c60d8cfe72f1285f7d33227 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=5ba51ef26cb7d47d5c60d8cf…
Author: Zebediah Figura <z.figura12(a)gmail.com> Date: Wed Mar 25 23:29:02 2020 -0500 d3dcompiler: Get rid of the "len" parameter to write_declarations(). Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com> Signed-off-by: Matteo Bruni <mbruni(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/d3dcompiler_43/bytecodewriter.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/dlls/d3dcompiler_43/bytecodewriter.c b/dlls/d3dcompiler_43/bytecodewriter.c index b1c0bb6071..39ab6a5ccc 100644 --- a/dlls/d3dcompiler_43/bytecodewriter.c +++ b/dlls/d3dcompiler_43/bytecodewriter.c @@ -592,9 +592,9 @@ static DWORD d3dsp_register( D3DSHADER_PARAM_REGISTER_TYPE type, DWORD num ) /****************************************************** * Implementation of the writer functions starts here * ******************************************************/ -static void write_declarations(struct bc_writer *This, - struct bytecode_buffer *buffer, BOOL len, - const struct declaration *decls, unsigned int num, DWORD type) { +static void write_declarations(struct bc_writer *This, struct bytecode_buffer *buffer, + const struct declaration *decls, unsigned int num, DWORD type) +{ DWORD i; DWORD instr_dcl = D3DSIO_DCL; DWORD token; @@ -602,9 +602,8 @@ static void write_declarations(struct bc_writer *This, ZeroMemory(®, sizeof(reg)); - if(len) { + if (This->shader->major_version > 1) instr_dcl |= 2 << D3DSI_INSTLENGTH_SHIFT; - } for(i = 0; i < num; i++) { if(decls[i].builtin) continue; @@ -759,7 +758,7 @@ static void vs_1_x_header(struct bc_writer *This, const struct bwriter_shader *s return; } - write_declarations(This, buffer, FALSE, shader->inputs, shader->num_inputs, BWRITERSPR_INPUT); + write_declarations(This, buffer, shader->inputs, shader->num_inputs, BWRITERSPR_INPUT); write_constF(shader, buffer, FALSE); } @@ -1569,7 +1568,7 @@ static void vs_2_header(struct bc_writer *This, return; } - write_declarations(This, buffer, TRUE, shader->inputs, shader->num_inputs, BWRITERSPR_INPUT); + write_declarations(This, buffer, shader->inputs, shader->num_inputs, BWRITERSPR_INPUT); write_constF(shader, buffer, TRUE); write_constB(shader, buffer, TRUE); write_constI(shader, buffer, TRUE); @@ -1836,7 +1835,7 @@ static void ps_2_header(struct bc_writer *This, const struct bwriter_shader *sha return; } - write_declarations(This, buffer, TRUE, shader->inputs, shader->num_inputs, BWRITERSPR_INPUT); + write_declarations(This, buffer, shader->inputs, shader->num_inputs, BWRITERSPR_INPUT); write_samplers(shader, buffer); write_constF(shader, buffer, TRUE); write_constB(shader, buffer, TRUE); @@ -2065,8 +2064,8 @@ static const struct bytecode_backend ps_2_x_backend = { }; static void sm_3_header(struct bc_writer *This, const struct bwriter_shader *shader, struct bytecode_buffer *buffer) { - write_declarations(This, buffer, TRUE, shader->inputs, shader->num_inputs, BWRITERSPR_INPUT); - write_declarations(This, buffer, TRUE, shader->outputs, shader->num_outputs, BWRITERSPR_OUTPUT); + write_declarations(This, buffer, shader->inputs, shader->num_inputs, BWRITERSPR_INPUT); + write_declarations(This, buffer, shader->outputs, shader->num_outputs, BWRITERSPR_OUTPUT); write_constF(shader, buffer, TRUE); write_constB(shader, buffer, TRUE); write_constI(shader, buffer, TRUE);
1
0
0
0
Zebediah Figura : d3dcompiler: Get rid of the init_*_dx9_writer() helpers.
by Alexandre Julliard
27 Mar '20
27 Mar '20
Module: wine Branch: master Commit: e04d149de8b2328fad8a1b035a1e8edefbbeb8cb URL:
https://source.winehq.org/git/wine.git/?a=commit;h=e04d149de8b2328fad8a1b03…
Author: Zebediah Figura <z.figura12(a)gmail.com> Date: Wed Mar 25 23:29:01 2020 -0500 d3dcompiler: Get rid of the init_*_dx9_writer() helpers. Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com> Signed-off-by: Matteo Bruni <mbruni(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/d3dcompiler_43/bytecodewriter.c | 174 +++++++++-------------------------- 1 file changed, 44 insertions(+), 130 deletions(-) diff --git a/dlls/d3dcompiler_43/bytecodewriter.c b/dlls/d3dcompiler_43/bytecodewriter.c index 35bd6669ef..b1c0bb6071 100644 --- a/dlls/d3dcompiler_43/bytecodewriter.c +++ b/dlls/d3dcompiler_43/bytecodewriter.c @@ -2285,130 +2285,29 @@ static const struct bytecode_backend ps_3_backend = { ps_3_handlers }; -static void init_vs10_dx9_writer(struct bc_writer *writer) { - TRACE("Creating DirectX9 vertex shader 1.0 writer\n"); - writer->funcs = &vs_1_x_backend; -} - -static void init_vs11_dx9_writer(struct bc_writer *writer) { - TRACE("Creating DirectX9 vertex shader 1.1 writer\n"); - writer->funcs = &vs_1_x_backend; -} - -static void init_vs20_dx9_writer(struct bc_writer *writer) { - TRACE("Creating DirectX9 vertex shader 2.0 writer\n"); - writer->funcs = &vs_2_0_backend; -} - -static void init_vs2x_dx9_writer(struct bc_writer *writer) { - TRACE("Creating DirectX9 vertex shader 2.x writer\n"); - writer->funcs = &vs_2_x_backend; -} - -static void init_vs30_dx9_writer(struct bc_writer *writer) { - TRACE("Creating DirectX9 vertex shader 3.0 writer\n"); - writer->funcs = &vs_3_backend; -} - -static void init_ps10_dx9_writer(struct bc_writer *writer) { - TRACE("Creating DirectX9 pixel shader 1.0 writer\n"); - writer->funcs = &ps_1_0123_backend; -} - -static void init_ps11_dx9_writer(struct bc_writer *writer) { - TRACE("Creating DirectX9 pixel shader 1.1 writer\n"); - writer->funcs = &ps_1_0123_backend; -} - -static void init_ps12_dx9_writer(struct bc_writer *writer) { - TRACE("Creating DirectX9 pixel shader 1.2 writer\n"); - writer->funcs = &ps_1_0123_backend; -} - -static void init_ps13_dx9_writer(struct bc_writer *writer) { - TRACE("Creating DirectX9 pixel shader 1.3 writer\n"); - writer->funcs = &ps_1_0123_backend; -} - -static void init_ps14_dx9_writer(struct bc_writer *writer) { - TRACE("Creating DirectX9 pixel shader 1.4 writer\n"); - writer->funcs = &ps_1_4_backend; -} - -static void init_ps20_dx9_writer(struct bc_writer *writer) { - TRACE("Creating DirectX9 pixel shader 2.0 writer\n"); - writer->funcs = &ps_2_0_backend; -} - -static void init_ps2x_dx9_writer(struct bc_writer *writer) { - TRACE("Creating DirectX9 pixel shader 2.x writer\n"); - writer->funcs = &ps_2_x_backend; -} - -static void init_ps30_dx9_writer(struct bc_writer *writer) { - TRACE("Creating DirectX9 pixel shader 3.0 writer\n"); - writer->funcs = &ps_3_backend; -} - -static struct bc_writer *create_writer(DWORD version) +static const struct { - struct bc_writer *ret = d3dcompiler_alloc(sizeof(*ret)); - - if(!ret) { - WARN("Failed to allocate a bytecode writer instance\n"); - return NULL; - } - - switch(version) { - case BWRITERVS_VERSION(1, 0): - init_vs10_dx9_writer(ret); - break; - case BWRITERVS_VERSION(1, 1): - init_vs11_dx9_writer(ret); - break; - case BWRITERVS_VERSION(2, 0): - init_vs20_dx9_writer(ret); - break; - case BWRITERVS_VERSION(2, 1): - init_vs2x_dx9_writer(ret); - break; - case BWRITERVS_VERSION(3, 0): - init_vs30_dx9_writer(ret); - break; - case BWRITERPS_VERSION(1, 0): - init_ps10_dx9_writer(ret); - break; - case BWRITERPS_VERSION(1, 1): - init_ps11_dx9_writer(ret); - break; - case BWRITERPS_VERSION(1, 2): - init_ps12_dx9_writer(ret); - break; - case BWRITERPS_VERSION(1, 3): - init_ps13_dx9_writer(ret); - break; - case BWRITERPS_VERSION(1, 4): - init_ps14_dx9_writer(ret); - break; - case BWRITERPS_VERSION(2, 0): - init_ps20_dx9_writer(ret); - break; - case BWRITERPS_VERSION(2, 1): - init_ps2x_dx9_writer(ret); - break; - case BWRITERPS_VERSION(3, 0): - init_ps30_dx9_writer(ret); - break; - default: - WARN("Unexpected shader version requested: %08x\n", version); - goto fail; - } - return ret; - -fail: - d3dcompiler_free(ret); - return NULL; + enum shader_type type; + unsigned char major, minor; + const struct bytecode_backend *backend; } +shader_backends[] = +{ + {ST_VERTEX, 1, 0, &vs_1_x_backend}, + {ST_VERTEX, 1, 1, &vs_1_x_backend}, + {ST_VERTEX, 2, 0, &vs_2_0_backend}, + {ST_VERTEX, 2, 1, &vs_2_x_backend}, + {ST_VERTEX, 3, 0, &vs_3_backend}, + + {ST_PIXEL, 1, 0, &ps_1_0123_backend}, + {ST_PIXEL, 1, 1, &ps_1_0123_backend}, + {ST_PIXEL, 1, 2, &ps_1_0123_backend}, + {ST_PIXEL, 1, 3, &ps_1_0123_backend}, + {ST_PIXEL, 1, 4, &ps_1_4_backend}, + {ST_PIXEL, 2, 0, &ps_2_0_backend}, + {ST_PIXEL, 2, 1, &ps_2_x_backend}, + {ST_PIXEL, 3, 0, &ps_3_backend}, +}; static HRESULT call_instr_handler(struct bc_writer *writer, const struct instruction *instr, @@ -2443,17 +2342,32 @@ HRESULT shader_write_bytecode(const struct bwriter_shader *shader, DWORD **resul ERR("NULL shader structure, aborting\n"); return E_FAIL; } - writer = create_writer(sm1_version(shader)); - writer->shader = shader; - *result = NULL; - if(!writer) { - WARN("Could not create a bytecode writer instance. Either unsupported version\n"); - WARN("or out of memory\n"); - hr = E_FAIL; - goto error; + if (!(writer = d3dcompiler_alloc(sizeof(*writer)))) + return E_OUTOFMEMORY; + + for (i = 0; i < ARRAY_SIZE(shader_backends); ++i) + { + if (shader->type == shader_backends[i].type + && shader->major_version == shader_backends[i].major + && shader->minor_version == shader_backends[i].minor) + { + writer->funcs = shader_backends[i].backend; + break; + } + } + + if (!writer->funcs) + { + FIXME("Unsupported shader type %#x, version %u.%u.\n", + shader->type, shader->major_version, shader->minor_version); + d3dcompiler_free(writer); + return E_NOTIMPL; } + writer->shader = shader; + *result = NULL; + buffer = allocate_buffer(); if(!buffer) { WARN("Failed to allocate a buffer for the shader bytecode\n");
1
0
0
0
Connor McAdams : d3d10/tests: Add ID3D10EffectShaderResourceVariable tests.
by Alexandre Julliard
27 Mar '20
27 Mar '20
Module: wine Branch: master Commit: 5f6477cbc3d4c63214db1242f64b301813cad97f URL:
https://source.winehq.org/git/wine.git/?a=commit;h=5f6477cbc3d4c63214db1242…
Author: Connor McAdams <conmanx360(a)gmail.com> Date: Fri Mar 27 21:05:09 2020 +0100 d3d10/tests: Add ID3D10EffectShaderResourceVariable tests. Signed-off-by: Connor McAdams <conmanx360(a)gmail.com> Signed-off-by: Matteo Bruni <mbruni(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/d3d10/tests/effect.c | 229 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 229 insertions(+) Diff:
https://source.winehq.org/git/wine.git/?a=commitdiff;h=5f6477cbc3d4c63214db…
1
0
0
0
Matteo Bruni : d3d10/tests: Improve compare_matrix() ok() messages.
by Alexandre Julliard
27 Mar '20
27 Mar '20
Module: wine Branch: master Commit: 9b28ab83d6fbf9ba2aead07ec99481e86187660e URL:
https://source.winehq.org/git/wine.git/?a=commit;h=9b28ab83d6fbf9ba2aead07e…
Author: Matteo Bruni <mbruni(a)codeweavers.com> Date: Fri Mar 27 21:05:10 2020 +0100 d3d10/tests: Improve compare_matrix() ok() messages. Signed-off-by: Matteo Bruni <mbruni(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/d3d10/tests/effect.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dlls/d3d10/tests/effect.c b/dlls/d3d10/tests/effect.c index 7b9bcfb50d..02b91735f1 100644 --- a/dlls/d3d10/tests/effect.c +++ b/dlls/d3d10/tests/effect.c @@ -5168,7 +5168,8 @@ static void compare_matrix(const char *name, unsigned int line, struct d3d10_mat for (col = 0; col < col_count; ++col) { tmp = !transpose ? b->m[row][col] : b->m[col][row]; - ok(a->m[row][col] == tmp, "Variable %s, line %d, got unexpected value 0x%08x.\n", name, line, + ok_(__FILE__, line)(a->m[row][col] == tmp, + "Variable %s (%u, %u), got unexpected value 0x%08x.\n", name, row, col, *(unsigned int *)&tmp); } }
1
0
0
0
Connor McAdams : d3d10: Implement ShaderResource effect variable set method.
by Alexandre Julliard
27 Mar '20
27 Mar '20
Module: wine Branch: master Commit: 1db43d5f55e0eb4f54a5df2f5061efd9dcdefeb7 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=1db43d5f55e0eb4f54a5df2f…
Author: Connor McAdams <conmanx360(a)gmail.com> Date: Thu Mar 26 00:05:32 2020 -0400 d3d10: Implement ShaderResource effect variable set method. Signed-off-by: Connor McAdams <conmanx360(a)gmail.com> Signed-off-by: Matteo Bruni <mbruni(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/d3d10/d3d10_private.h | 7 +++ dlls/d3d10/effect.c | 114 ++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 114 insertions(+), 7 deletions(-) diff --git a/dlls/d3d10/d3d10_private.h b/dlls/d3d10/d3d10_private.h index 21d7f964e8..8d48231d97 100644 --- a/dlls/d3d10/d3d10_private.h +++ b/dlls/d3d10/d3d10_private.h @@ -131,6 +131,12 @@ struct d3d10_effect_state_object_variable } object; }; +struct d3d10_effect_resource_variable +{ + ID3D10ShaderResourceView **srv; + BOOL parent; +}; + struct d3d10_effect_buffer_variable { ID3D10Buffer *buffer; @@ -196,6 +202,7 @@ struct d3d10_effect_variable struct d3d10_effect_state_object_variable state; struct d3d10_effect_shader_variable shader; struct d3d10_effect_buffer_variable buffer; + struct d3d10_effect_resource_variable resource; } u; }; diff --git a/dlls/d3d10/effect.c b/dlls/d3d10/effect.c index 3d397a38eb..04376efe9c 100644 --- a/dlls/d3d10/effect.c +++ b/dlls/d3d10/effect.c @@ -2079,6 +2079,28 @@ static HRESULT parse_fx10_local_variable(const char *data, size_t data_size, case D3D10_SVT_TEXTURE2DMSARRAY: case D3D10_SVT_TEXTURE3D: case D3D10_SVT_TEXTURECUBE: + if (!v->type->element_count) + i = 1; + else + i = v->type->element_count; + + if (!(v->u.resource.srv = heap_calloc(i, sizeof(*v->u.resource.srv)))) + { + ERR("Failed to allocate shader resource view array memory.\n"); + return E_OUTOFMEMORY; + } + v->u.resource.parent = TRUE; + + if (v->elements) + { + for (i = 0; i < v->type->element_count; ++i) + { + v->elements[i].u.resource.srv = &v->u.resource.srv[i]; + v->elements[i].u.resource.parent = FALSE; + } + } + break; + case D3D10_SVT_RENDERTARGETVIEW: case D3D10_SVT_DEPTHSTENCILVIEW: case D3D10_SVT_BUFFER: @@ -2716,7 +2738,7 @@ static void d3d10_effect_shader_variable_destroy(struct d3d10_effect_shader_vari static void d3d10_effect_variable_destroy(struct d3d10_effect_variable *v) { - unsigned int i; + unsigned int i, elem_count; TRACE("variable %p.\n", v); @@ -2779,6 +2801,31 @@ static void d3d10_effect_variable_destroy(struct d3d10_effect_variable *v) ID3D10SamplerState_Release(v->u.state.object.sampler); break; + case D3D10_SVT_TEXTURE1D: + case D3D10_SVT_TEXTURE1DARRAY: + case D3D10_SVT_TEXTURE2D: + case D3D10_SVT_TEXTURE2DARRAY: + case D3D10_SVT_TEXTURE2DMS: + case D3D10_SVT_TEXTURE2DMSARRAY: + case D3D10_SVT_TEXTURE3D: + case D3D10_SVT_TEXTURECUBE: + if (!v->u.resource.parent) + break; + + if (!v->type->element_count) + elem_count = 1; + else + elem_count = v->type->element_count; + + for (i = 0; i < elem_count; ++i) + { + if (v->u.resource.srv[i]) + ID3D10ShaderResourceView_Release(v->u.resource.srv[i]); + } + + heap_free(v->u.resource.srv); + break; + default: break; } @@ -3674,8 +3721,14 @@ static void apply_shader_resources(ID3D10Device *device, struct ID3D10EffectShad break; case D3D10_SIT_TBUFFER: - update_buffer(device, rsrc_v); - srv = &rsrc_v->u.buffer.resource_view; + case D3D10_SIT_TEXTURE: + if (sr->in_type == D3D10_SIT_TBUFFER) + { + update_buffer(device, rsrc_v); + srv = &rsrc_v->u.buffer.resource_view; + } + else + srv = rsrc_v->u.resource.srv; switch (v->type->basetype) { @@ -5924,8 +5977,27 @@ static const struct ID3D10EffectStringVariableVtbl d3d10_effect_string_variable_ d3d10_effect_string_variable_GetStringArray, }; +static void set_shader_resource_variable(ID3D10ShaderResourceView **src, ID3D10ShaderResourceView **dst) +{ + if (*dst == *src) + return; + + if (*src) + ID3D10ShaderResourceView_AddRef(*src); + if (*dst) + ID3D10ShaderResourceView_Release(*dst); + + *dst = *src; +} + /* ID3D10EffectVariable methods */ +static inline struct d3d10_effect_variable *impl_from_ID3D10EffectShaderResourceVariable( + ID3D10EffectShaderResourceVariable *iface) +{ + return CONTAINING_RECORD(iface, struct d3d10_effect_variable, ID3D10EffectVariable_iface); +} + static BOOL STDMETHODCALLTYPE d3d10_effect_shader_resource_variable_IsValid(ID3D10EffectShaderResourceVariable *iface) { TRACE("iface %p\n", iface); @@ -6082,9 +6154,13 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_resource_variable_GetRawVal static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_resource_variable_SetResource( ID3D10EffectShaderResourceVariable *iface, ID3D10ShaderResourceView *resource) { - FIXME("iface %p, resource %p stub!\n", iface, resource); + struct d3d10_effect_variable *v = impl_from_ID3D10EffectShaderResourceVariable(iface); - return E_NOTIMPL; + TRACE("iface %p, resource %p.\n", iface, resource); + + set_shader_resource_variable(&resource, v->u.resource.srv); + + return S_OK; } static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_resource_variable_GetResource( @@ -6098,9 +6174,33 @@ static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_resource_variable_GetResour static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_resource_variable_SetResourceArray( ID3D10EffectShaderResourceVariable *iface, ID3D10ShaderResourceView **resources, UINT offset, UINT count) { - FIXME("iface %p, resources %p, offset %u, count %u stub!\n", iface, resources, offset, count); + struct d3d10_effect_variable *v = impl_from_ID3D10EffectShaderResourceVariable(iface); + ID3D10ShaderResourceView **rsrc_view; + unsigned int i; - return E_NOTIMPL; + TRACE("iface %p, resources %p, offset %u, count %u.\n", iface, resources, offset, count); + + if (!v->type->element_count) + return d3d10_effect_shader_resource_variable_SetResource(iface, *resources); + + if (offset >= v->type->element_count) + { + WARN("Offset %u larger than element count %u, ignoring.\n", offset, v->type->element_count); + return S_OK; + } + + if (count > v->type->element_count - offset) + { + WARN("Offset %u, count %u overruns the variable (element count %u), fixing up.\n", + offset, count, v->type->element_count); + count = v->type->element_count - offset; + } + + rsrc_view = &v->u.resource.srv[offset]; + for (i = 0; i < count; ++i) + set_shader_resource_variable(&resources[i], &rsrc_view[i]); + + return S_OK; } static HRESULT STDMETHODCALLTYPE d3d10_effect_shader_resource_variable_GetResourceArray(
1
0
0
0
Anton Baskanov : amstream: Implement MediaStreamFilter::Stop, ::Pause, and ::Run.
by Alexandre Julliard
27 Mar '20
27 Mar '20
Module: wine Branch: master Commit: 2006621683639b29be59e584af156b72055c43db URL:
https://source.winehq.org/git/wine.git/?a=commit;h=2006621683639b29be59e584…
Author: Anton Baskanov <baskanov(a)gmail.com> Date: Fri Mar 27 11:54:32 2020 -0500 amstream: Implement MediaStreamFilter::Stop, ::Pause, and ::Run. Signed-off-by: Anton Baskanov <baskanov(a)gmail.com> Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/amstream/filter.c | 48 ++++++++++++++-- dlls/amstream/tests/amstream.c | 124 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 162 insertions(+), 10 deletions(-) diff --git a/dlls/amstream/filter.c b/dlls/amstream/filter.c index 1cb2ca71ba..fb9b1d9aee 100644 --- a/dlls/amstream/filter.c +++ b/dlls/amstream/filter.c @@ -242,25 +242,61 @@ static HRESULT WINAPI filter_GetClassID(IMediaStreamFilter *iface, CLSID *clsid) return S_OK; } +static void set_state(struct filter *filter, FILTER_STATE state) +{ + if (filter->state != state) + { + ULONG i; + + for (i = 0; i < filter->nb_streams; ++i) + IAMMediaStream_SetState(filter->streams[i], state); + filter->state = state; + } +} + static HRESULT WINAPI filter_Stop(IMediaStreamFilter *iface) { - FIXME("(%p)->(): Stub!\n", iface); + struct filter *filter = impl_from_IMediaStreamFilter(iface); - return E_NOTIMPL; + TRACE("iface %p.\n", iface); + + EnterCriticalSection(&filter->cs); + + set_state(filter, State_Stopped); + + LeaveCriticalSection(&filter->cs); + + return S_OK; } static HRESULT WINAPI filter_Pause(IMediaStreamFilter *iface) { - FIXME("(%p)->(): Stub!\n", iface); + struct filter *filter = impl_from_IMediaStreamFilter(iface); - return E_NOTIMPL; + TRACE("iface %p.\n", iface); + + EnterCriticalSection(&filter->cs); + + set_state(filter, State_Paused); + + LeaveCriticalSection(&filter->cs); + + return S_OK; } static HRESULT WINAPI filter_Run(IMediaStreamFilter *iface, REFERENCE_TIME start) { - FIXME("(%p)->(%s): Stub!\n", iface, wine_dbgstr_longlong(start)); + struct filter *filter = impl_from_IMediaStreamFilter(iface); - return E_NOTIMPL; + TRACE("iface %p, start %s.\n", iface, wine_dbgstr_longlong(start)); + + EnterCriticalSection(&filter->cs); + + set_state(filter, State_Running); + + LeaveCriticalSection(&filter->cs); + + return S_OK; } static HRESULT WINAPI filter_GetState(IMediaStreamFilter *iface, DWORD timeout, FILTER_STATE *state) diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c index 02fea447d0..82a833ad6f 100644 --- a/dlls/amstream/tests/amstream.c +++ b/dlls/amstream/tests/amstream.c @@ -311,9 +311,12 @@ struct teststream IAMMediaStream IAMMediaStream_iface; IPin IPin_iface; LONG refcount; + GUID mspid; IAMMultiMediaStream *mmstream; IMediaStreamFilter *filter; IFilterGraph *graph; + FILTER_STATE state; + HRESULT set_state_result; }; static struct teststream *impl_from_IAMMediaStream(IAMMediaStream *iface) @@ -500,9 +503,12 @@ static HRESULT WINAPI stream_GetMultiMediaStream(IAMMediaStream *iface, IMultiMe static HRESULT WINAPI stream_GetInformation(IAMMediaStream *iface, MSPID *id, STREAM_TYPE *type) { + struct teststream *stream = impl_from_IAMMediaStream(iface); if (winetest_debug > 1) trace("GetInformation(%p, %p)\n", id, type); - *id = test_mspid; - ok(!type, "Got unexpected type %p.\n", type); + if (id) + *id = stream->mspid; + if (type) + *type = STREAMTYPE_READ; return S_OK; } @@ -540,8 +546,11 @@ static HRESULT WINAPI stream_Initialize(IAMMediaStream *iface, IUnknown *source, static HRESULT WINAPI stream_SetState(IAMMediaStream *iface, FILTER_STATE state) { - ok(0, "Unexpected call.\n"); - return E_NOTIMPL; + struct teststream *stream = impl_from_IAMMediaStream(iface); + if (winetest_debug > 1) trace("SetState(%#x)\n", state); + if (SUCCEEDED(stream->set_state_result)) + stream->state = state; + return stream->set_state_result; } static HRESULT WINAPI stream_JoinAMMultiMediaStream(IAMMediaStream *iface, IAMMultiMediaStream *mmstream) @@ -592,6 +601,8 @@ static void teststream_init(struct teststream *stream) stream->IAMMediaStream_iface.lpVtbl = &stream_vtbl; stream->IPin_iface.lpVtbl = &pin_vtbl; stream->refcount = 1; + stream->mspid = test_mspid; + stream->set_state_result = S_OK; } #define check_enum_stream(a,b,c,d) check_enum_stream_(__LINE__,a,b,c,d) @@ -2800,6 +2811,110 @@ void test_mediastreamfilter_get_state(void) ok(!ref, "Got outstanding refcount %d.\n", ref); } +void check_mediastreamfilter_state(FILTER_STATE expected_state, HRESULT (*set_state)(IMediaStreamFilter *), + HRESULT (*reset_state)(IMediaStreamFilter *)) +{ + IAMMultiMediaStream *mmstream = create_ammultimediastream(); + struct teststream teststream, teststream2; + IMediaStreamFilter *filter; + FILTER_STATE state; + HRESULT hr; + ULONG ref; + + teststream_init(&teststream); + teststream_init(&teststream2); + + teststream2.mspid.Data2 = 1; + + hr = IAMMultiMediaStream_Initialize(mmstream, STREAMTYPE_READ, 0, NULL); + ok(hr == S_OK, "Got hr %#x.\n", hr); + hr = IAMMultiMediaStream_AddMediaStream(mmstream, (IUnknown *)&teststream, &teststream.mspid, 0, NULL); + ok(hr == S_OK, "Got hr %#x.\n", hr); + hr = IAMMultiMediaStream_AddMediaStream(mmstream, (IUnknown *)&teststream2, &teststream2.mspid, 0, NULL); + ok(hr == S_OK, "Got hr %#x.\n", hr); + hr = IAMMultiMediaStream_GetFilter(mmstream, &filter); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(filter != NULL, "Expected non-null filter\n"); + + hr = reset_state(filter); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + teststream.state = 0xcc; + teststream2.state = 0xcc; + hr = set_state(filter); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(teststream.state == expected_state, "Got state %#x.\n", teststream.state); + ok(teststream2.state == expected_state, "Got state %#x.\n", teststream2.state); + hr = IMediaStreamFilter_GetState(filter, 0, &state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == expected_state, "Got state %#x.\n", state); + + teststream.state = 0xcc; + teststream2.state = 0xcc; + hr = set_state(filter); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(teststream.state == 0xcc, "Got state %#x.\n", teststream.state); + ok(teststream2.state == 0xcc, "Got state %#x.\n", teststream2.state); + + hr = reset_state(filter); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + teststream.set_state_result = E_FAIL; + teststream.state = 0xcc; + teststream2.state = 0xcc; + hr = set_state(filter); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(teststream.state == 0xcc, "Got state %#x.\n", teststream.state); + ok(teststream2.state == expected_state, "Got state %#x.\n", teststream2.state); + hr = IMediaStreamFilter_GetState(filter, 0, &state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == expected_state, "Got state %#x.\n", state); + + hr = reset_state(filter); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + teststream.set_state_result = E_FAIL; + teststream2.set_state_result = E_FAIL; + teststream.state = 0xcc; + teststream2.state = 0xcc; + hr = set_state(filter); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(teststream.state == 0xcc, "Got state %#x.\n", teststream.state); + ok(teststream2.state == 0xcc, "Got state %#x.\n", teststream2.state); + hr = IMediaStreamFilter_GetState(filter, 0, &state); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(state == expected_state, "Got state %#x.\n", state); + + ref = IAMMultiMediaStream_Release(mmstream); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ref = IMediaStreamFilter_Release(filter); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ok(teststream.refcount == 1, "Got outstanding refcount %d.\n", teststream.refcount); + ok(teststream2.refcount == 1, "Got outstanding refcount %d.\n", teststream2.refcount); +} + +static HRESULT mediastreamfilter_stop(IMediaStreamFilter *filter) +{ + return IMediaStreamFilter_Stop(filter); +} + +static HRESULT mediastreamfilter_pause(IMediaStreamFilter *filter) +{ + return IMediaStreamFilter_Pause(filter); +} + +static HRESULT mediastreamfilter_run(IMediaStreamFilter *filter) +{ + return IMediaStreamFilter_Run(filter, 0); +} + +void test_mediastreamfilter_stop_pause_run(void) +{ + check_mediastreamfilter_state(State_Stopped, mediastreamfilter_stop, mediastreamfilter_run); + check_mediastreamfilter_state(State_Paused, mediastreamfilter_pause, mediastreamfilter_stop); + check_mediastreamfilter_state(State_Running, mediastreamfilter_run, mediastreamfilter_stop); +} + START_TEST(amstream) { HANDLE file; @@ -2838,6 +2953,7 @@ START_TEST(amstream) test_audiostream_receive_connection(); test_mediastreamfilter_get_state(); + test_mediastreamfilter_stop_pause_run(); CoUninitialize(); }
1
0
0
0
Anton Baskanov : amstream/tests: Refactor test stream to allow multiple instances.
by Alexandre Julliard
27 Mar '20
27 Mar '20
Module: wine Branch: master Commit: ed93b25f4d361103c56056941e7a7fa605640922 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=ed93b25f4d361103c5605694…
Author: Anton Baskanov <baskanov(a)gmail.com> Date: Fri Mar 27 11:54:31 2020 -0500 amstream/tests: Refactor test stream to allow multiple instances. Signed-off-by: Anton Baskanov <baskanov(a)gmail.com> Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/amstream/tests/amstream.c | 74 ++++++++++++++++++++++++++++++------------ 1 file changed, 53 insertions(+), 21 deletions(-) diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c index cfdd8b6c8d..02fea447d0 100644 --- a/dlls/amstream/tests/amstream.c +++ b/dlls/amstream/tests/amstream.c @@ -305,25 +305,43 @@ error: } static const GUID test_mspid = {0x88888888}; -static IAMMediaStream teststream; -static LONG teststream_refcount = 1; -static IAMMultiMediaStream *teststream_mmstream; -static IMediaStreamFilter *teststream_filter; -static IFilterGraph *teststream_graph; + +struct teststream +{ + IAMMediaStream IAMMediaStream_iface; + IPin IPin_iface; + LONG refcount; + IAMMultiMediaStream *mmstream; + IMediaStreamFilter *filter; + IFilterGraph *graph; +}; + +static struct teststream *impl_from_IAMMediaStream(IAMMediaStream *iface) +{ + return CONTAINING_RECORD(iface, struct teststream, IAMMediaStream_iface); +} + +static struct teststream *impl_from_IPin(IPin *iface) +{ + return CONTAINING_RECORD(iface, struct teststream, IPin_iface); +} static HRESULT WINAPI pin_QueryInterface(IPin *iface, REFIID iid, void **out) { - return IAMMediaStream_QueryInterface(&teststream, iid, out); + struct teststream *stream = impl_from_IPin(iface); + return IAMMediaStream_QueryInterface(&stream->IAMMediaStream_iface, iid, out); } static ULONG WINAPI pin_AddRef(IPin *iface) { - return IAMMediaStream_AddRef(&teststream); + struct teststream *stream = impl_from_IPin(iface); + return IAMMediaStream_AddRef(&stream->IAMMediaStream_iface); } static ULONG WINAPI pin_Release(IPin *iface) { - return IAMMediaStream_Release(&teststream); + struct teststream *stream = impl_from_IPin(iface); + return IAMMediaStream_Release(&stream->IAMMediaStream_iface); } static HRESULT WINAPI pin_Connect(IPin *iface, IPin *peer, const AM_MEDIA_TYPE *mt) @@ -439,10 +457,10 @@ static const IPinVtbl pin_vtbl = pin_NewSegment }; -static IPin testpin = {&pin_vtbl}; - static HRESULT WINAPI stream_QueryInterface(IAMMediaStream *iface, REFIID iid, void **out) { + struct teststream *stream = impl_from_IAMMediaStream(iface); + if (winetest_debug > 1) trace("QueryInterface(%s)\n", wine_dbgstr_guid(iid)); if (IsEqualGUID(iid, &IID_IUnknown) || IsEqualGUID(iid, &IID_IMediaStream) || IsEqualGUID(iid, &IID_IAMMediaStream)) @@ -454,7 +472,7 @@ static HRESULT WINAPI stream_QueryInterface(IAMMediaStream *iface, REFIID iid, v else if (IsEqualGUID(iid, &IID_IPin)) { IAMMediaStream_AddRef(iface); - *out = &testpin; + *out = &stream->IPin_iface; return S_OK; } @@ -464,12 +482,14 @@ static HRESULT WINAPI stream_QueryInterface(IAMMediaStream *iface, REFIID iid, v static ULONG WINAPI stream_AddRef(IAMMediaStream *iface) { - return InterlockedIncrement(&teststream_refcount); + struct teststream *stream = impl_from_IAMMediaStream(iface); + return InterlockedIncrement(&stream->refcount); } static ULONG WINAPI stream_Release(IAMMediaStream *iface) { - return InterlockedDecrement(&teststream_refcount); + struct teststream *stream = impl_from_IAMMediaStream(iface); + return InterlockedDecrement(&stream->refcount); } static HRESULT WINAPI stream_GetMultiMediaStream(IAMMediaStream *iface, IMultiMediaStream **mmstream) @@ -526,22 +546,25 @@ static HRESULT WINAPI stream_SetState(IAMMediaStream *iface, FILTER_STATE state) static HRESULT WINAPI stream_JoinAMMultiMediaStream(IAMMediaStream *iface, IAMMultiMediaStream *mmstream) { + struct teststream *stream = impl_from_IAMMediaStream(iface); if (winetest_debug > 1) trace("JoinAMMultiMediaStream(%p)\n", mmstream); - teststream_mmstream = mmstream; + stream->mmstream = mmstream; return S_OK; } static HRESULT WINAPI stream_JoinFilter(IAMMediaStream *iface, IMediaStreamFilter *filter) { + struct teststream *stream = impl_from_IAMMediaStream(iface); if (winetest_debug > 1) trace("JoinFilter(%p)\n", filter); - teststream_filter = filter; + stream->filter = filter; return S_OK; } static HRESULT WINAPI stream_JoinFilterGraph(IAMMediaStream *iface, IFilterGraph *graph) { + struct teststream *stream = impl_from_IAMMediaStream(iface); if (winetest_debug > 1) trace("JoinFilterGraph(%p)\n", graph); - teststream_graph = graph; + stream->graph = graph; return S_OK; } @@ -563,7 +586,13 @@ static const IAMMediaStreamVtbl stream_vtbl = stream_JoinFilterGraph, }; -static IAMMediaStream teststream = {&stream_vtbl}; +static void teststream_init(struct teststream *stream) +{ + memset(stream, 0, sizeof(*stream)); + stream->IAMMediaStream_iface.lpVtbl = &stream_vtbl; + stream->IPin_iface.lpVtbl = &pin_vtbl; + stream->refcount = 1; +} #define check_enum_stream(a,b,c,d) check_enum_stream_(__LINE__,a,b,c,d) static void check_enum_stream_(int line, IAMMultiMediaStream *mmstream, @@ -616,6 +645,7 @@ static void test_add_stream(void) IMediaStream *video_stream, *audio_stream, *stream; IDirectDrawMediaStream *ddraw_stream; IMediaStreamFilter *stream_filter; + struct teststream teststream; IDirectDraw *ddraw, *ddraw2; IEnumFilters *enum_filters; IBaseFilter *filters[3]; @@ -624,6 +654,8 @@ static void test_add_stream(void) CLSID clsid; HRESULT hr; + teststream_init(&teststream); + hr = IAMMultiMediaStream_GetFilter(mmstream, &stream_filter); ok(hr == S_OK, "Got hr %#x.\n", hr); @@ -687,9 +719,9 @@ static void test_add_stream(void) ok(hr == S_OK, "Got hr %#x.\n", hr); ok(stream == (IMediaStream *)&teststream, "Streams didn't match.\n"); if (hr == S_OK) IMediaStream_Release(stream); - todo_wine ok(teststream_mmstream == mmstream, "IAMMultiMediaStream objects didn't match.\n"); - ok(teststream_filter == stream_filter, "IMediaStreamFilter objects didn't match.\n"); - todo_wine ok(!!teststream_graph, "Expected a non-NULL graph.\n"); + todo_wine ok(teststream.mmstream == mmstream, "IAMMultiMediaStream objects didn't match.\n"); + ok(teststream.filter == stream_filter, "IMediaStreamFilter objects didn't match.\n"); + todo_wine ok(!!teststream.graph, "Expected a non-NULL graph.\n"); check_enum_stream(mmstream, stream_filter, 0, video_stream); check_enum_stream(mmstream, stream_filter, 1, audio_stream); @@ -725,7 +757,7 @@ static void test_add_stream(void) ok(!ref, "Got outstanding refcount %d.\n", ref); ref = IMediaStream_Release(audio_stream); ok(!ref, "Got outstanding refcount %d.\n", ref); - ok(teststream_refcount == 1, "Got outstanding refcount %d.\n", ref); + ok(teststream.refcount == 1, "Got outstanding refcount %d.\n", teststream.refcount); /* The return parameter is optional. */
1
0
0
0
Anton Baskanov : amstream: Implement MediaStreamFilter::GetState.
by Alexandre Julliard
27 Mar '20
27 Mar '20
Module: wine Branch: master Commit: ef2249e4b64a705a2079c4148bbe89f59962cf48 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=ef2249e4b64a705a2079c414…
Author: Anton Baskanov <baskanov(a)gmail.com> Date: Fri Mar 27 11:54:30 2020 -0500 amstream: Implement MediaStreamFilter::GetState. Signed-off-by: Anton Baskanov <baskanov(a)gmail.com> Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/amstream/filter.c | 15 +++++++++++++-- dlls/amstream/tests/amstream.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/dlls/amstream/filter.c b/dlls/amstream/filter.c index 80a885de24..1cb2ca71ba 100644 --- a/dlls/amstream/filter.c +++ b/dlls/amstream/filter.c @@ -171,6 +171,7 @@ struct filter IFilterGraph *graph; ULONG nb_streams; IAMMediaStream **streams; + FILTER_STATE state; }; static inline struct filter *impl_from_IMediaStreamFilter(IMediaStreamFilter *iface) @@ -264,9 +265,19 @@ static HRESULT WINAPI filter_Run(IMediaStreamFilter *iface, REFERENCE_TIME start static HRESULT WINAPI filter_GetState(IMediaStreamFilter *iface, DWORD timeout, FILTER_STATE *state) { - FIXME("iface %p, timeout %u, state %p, stub!\n", iface, timeout, state); + struct filter *filter = impl_from_IMediaStreamFilter(iface); + + TRACE("iface %p, timeout %u, state %p.\n", iface, timeout, state); + + if (!state) + return E_POINTER; + + EnterCriticalSection(&filter->cs); + + *state = filter->state; + + LeaveCriticalSection(&filter->cs); - *state = State_Stopped; return S_OK; } diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c index 09686cfcf4..cfdd8b6c8d 100644 --- a/dlls/amstream/tests/amstream.c +++ b/dlls/amstream/tests/amstream.c @@ -2737,6 +2737,37 @@ static void test_audiostream_receive_connection(void) ok(!ref, "Got outstanding refcount %d.\n", ref); } +void test_mediastreamfilter_get_state(void) +{ + IAMMultiMediaStream *mmstream = create_ammultimediastream(); + IMediaStreamFilter *filter; + FILTER_STATE state; + HRESULT hr; + ULONG ref; + + hr = IAMMultiMediaStream_Initialize(mmstream, STREAMTYPE_READ, 0, NULL); + ok(hr == S_OK, "Got hr %#x.\n", hr); + hr = IAMMultiMediaStream_GetFilter(mmstream, &filter); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!!filter, "Expected non-null filter.\n"); + + /* Crashes on native. */ + if (0) + { + hr = IMediaStreamFilter_GetState(filter, 0, NULL); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); + } + + state = 0xcc; + hr = IMediaStreamFilter_GetState(filter, 0, &state); + ok(state == State_Stopped, "Got state %#x.\n", state); + + ref = IAMMultiMediaStream_Release(mmstream); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ref = IMediaStreamFilter_Release(filter); + ok(!ref, "Got outstanding refcount %d.\n", ref); +} + START_TEST(amstream) { HANDLE file; @@ -2774,5 +2805,7 @@ START_TEST(amstream) test_audiostream_set_format(); test_audiostream_receive_connection(); + test_mediastreamfilter_get_state(); + CoUninitialize(); }
1
0
0
0
← Newer
1
...
11
12
13
14
15
16
17
...
100
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
Results per page:
10
25
50
100
200