Wine-devel
Threads by month
- ----- 2026 -----
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- 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
September 2018
- 70 participants
- 627 discussions
24 Sep '18
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
dlls/d2d1/bitmap_render_target.c | 12 ++++++------
dlls/d2d1/brush.c | 8 ++++----
dlls/d2d1/d2d1_private.h | 7 +++++++
dlls/d2d1/dc_render_target.c | 12 ++++++------
dlls/d2d1/device.c | 29 +++++++++++++++--------------
dlls/d2d1/factory.c | 2 +-
dlls/d2d1/geometry.c | 32 +++++++++++++++-----------------
dlls/d2d1/hwnd_render_target.c | 12 ++++++------
8 files changed, 60 insertions(+), 54 deletions(-)
diff --git a/dlls/d2d1/bitmap_render_target.c b/dlls/d2d1/bitmap_render_target.c
index 7411d488926..df5b013a0b5 100644
--- a/dlls/d2d1/bitmap_render_target.c
+++ b/dlls/d2d1/bitmap_render_target.c
@@ -218,8 +218,8 @@ static void STDMETHODCALLTYPE d2d_bitmap_render_target_DrawLine(ID2D1BitmapRende
{
struct d2d_bitmap_render_target *render_target = impl_from_ID2D1BitmapRenderTarget(iface);
- TRACE("iface %p, p0 {%.8e, %.8e}, p1 {%.8e, %.8e}, brush %p, stroke_width %.8e, stroke_style %p.\n",
- iface, p0.x, p0.y, p1.x, p1.y, brush, stroke_width, stroke_style);
+ TRACE("iface %p, p0 %s, p1 %s, brush %p, stroke_width %.8e, stroke_style %p.\n",
+ iface, debug_d2d_point_2f(&p0), debug_d2d_point_2f(&p1), brush, stroke_width, stroke_style);
ID2D1RenderTarget_DrawLine(render_target->dxgi_target, p0, p1, brush, stroke_width, stroke_style);
}
@@ -364,8 +364,8 @@ static void STDMETHODCALLTYPE d2d_bitmap_render_target_DrawTextLayout(ID2D1Bitma
{
struct d2d_bitmap_render_target *render_target = impl_from_ID2D1BitmapRenderTarget(iface);
- TRACE("iface %p, origin {%.8e, %.8e}, layout %p, brush %p, options %#x.\n",
- iface, origin.x, origin.y, layout, brush, options);
+ TRACE("iface %p, origin %s, layout %p, brush %p, options %#x.\n",
+ iface, debug_d2d_point_2f(&origin), layout, brush, options);
ID2D1RenderTarget_DrawTextLayout(render_target->dxgi_target, origin, layout, brush, options);
}
@@ -376,8 +376,8 @@ static void STDMETHODCALLTYPE d2d_bitmap_render_target_DrawGlyphRun(ID2D1BitmapR
{
struct d2d_bitmap_render_target *render_target = impl_from_ID2D1BitmapRenderTarget(iface);
- TRACE("iface %p, baseline_origin {%.8e, %.8e}, glyph_run %p, brush %p, measuring_mode %#x.\n",
- iface, baseline_origin.x, baseline_origin.y, glyph_run, brush, measuring_mode);
+ TRACE("iface %p, baseline_origin %s, glyph_run %p, brush %p, measuring_mode %#x.\n",
+ iface, debug_d2d_point_2f(&baseline_origin), glyph_run, brush, measuring_mode);
ID2D1RenderTarget_DrawGlyphRun(render_target->dxgi_target,
baseline_origin, glyph_run, brush, measuring_mode);
diff --git a/dlls/d2d1/brush.c b/dlls/d2d1/brush.c
index 30a4235cdab..9c73ae1d88f 100644
--- a/dlls/d2d1/brush.c
+++ b/dlls/d2d1/brush.c
@@ -502,7 +502,7 @@ static void STDMETHODCALLTYPE d2d_linear_gradient_brush_SetStartPoint(ID2D1Linea
{
struct d2d_brush *brush = impl_from_ID2D1LinearGradientBrush(iface);
- TRACE("iface %p, start_point {%.8e, %.8e}.\n", iface, start_point.x, start_point.y);
+ TRACE("iface %p, start_point %s.\n", iface, debug_d2d_point_2f(&start_point));
brush->u.linear.start = start_point;
}
@@ -512,7 +512,7 @@ static void STDMETHODCALLTYPE d2d_linear_gradient_brush_SetEndPoint(ID2D1LinearG
{
struct d2d_brush *brush = impl_from_ID2D1LinearGradientBrush(iface);
- TRACE("iface %p, end_point {%.8e, %.8e}.\n", iface, end_point.x, end_point.y);
+ TRACE("iface %p, end_point %s.\n", iface, debug_d2d_point_2f(&end_point));
brush->u.linear.end = end_point;
}
@@ -689,7 +689,7 @@ static void STDMETHODCALLTYPE d2d_radial_gradient_brush_SetCenter(ID2D1RadialGra
{
struct d2d_brush *brush = impl_from_ID2D1RadialGradientBrush(iface);
- TRACE("iface %p, centre {%.8e, %.8e}.\n", iface, centre.x, centre.y);
+ TRACE("iface %p, centre %s.\n", iface, debug_d2d_point_2f(¢re));
brush->u.radial.centre = centre;
}
@@ -699,7 +699,7 @@ static void STDMETHODCALLTYPE d2d_radial_gradient_brush_SetGradientOriginOffset(
{
struct d2d_brush *brush = impl_from_ID2D1RadialGradientBrush(iface);
- TRACE("iface %p, offset {%.8e, %.8e}.\n", iface, offset.x, offset.y);
+ TRACE("iface %p, offset %s.\n", iface, debug_d2d_point_2f(&offset));
brush->u.radial.offset = offset;
}
diff --git a/dlls/d2d1/d2d1_private.h b/dlls/d2d1/d2d1_private.h
index 2d3acd59977..9bfbbf2a6c4 100644
--- a/dlls/d2d1/d2d1_private.h
+++ b/dlls/d2d1/d2d1_private.h
@@ -587,6 +587,13 @@ static inline void d2d_rect_expand(D2D1_RECT_F *dst, const D2D1_POINT_2F *point)
dst->bottom = point->y;
}
+static inline const char *debug_d2d_point_2f(const D2D1_POINT_2F *point)
+{
+ if (!point)
+ return "(null)";
+ return wine_dbg_sprintf("{%.8e, %.8e}", point->x, point->y);
+}
+
static inline const char *debug_d2d_rect_f(const D2D1_RECT_F *rect)
{
if (!rect) return "(null)";
diff --git a/dlls/d2d1/dc_render_target.c b/dlls/d2d1/dc_render_target.c
index 050adf6dd6f..9a0f458fafe 100644
--- a/dlls/d2d1/dc_render_target.c
+++ b/dlls/d2d1/dc_render_target.c
@@ -247,8 +247,8 @@ static void STDMETHODCALLTYPE d2d_dc_render_target_DrawLine(ID2D1DCRenderTarget
{
struct d2d_dc_render_target *render_target = impl_from_ID2D1DCRenderTarget(iface);
- TRACE("iface %p, p0 {%.8e, %.8e}, p1 {%.8e, %.8e}, brush %p, stroke_width %.8e, stroke_style %p.\n",
- iface, p0.x, p0.y, p1.x, p1.y, brush, stroke_width, stroke_style);
+ TRACE("iface %p, p0 %s, p1 %s, brush %p, stroke_width %.8e, stroke_style %p.\n",
+ iface, debug_d2d_point_2f(&p0), debug_d2d_point_2f(&p1), brush, stroke_width, stroke_style);
ID2D1RenderTarget_DrawLine(render_target->dxgi_target, p0, p1, brush, stroke_width, stroke_style);
}
@@ -393,8 +393,8 @@ static void STDMETHODCALLTYPE d2d_dc_render_target_DrawTextLayout(ID2D1DCRenderT
{
struct d2d_dc_render_target *render_target = impl_from_ID2D1DCRenderTarget(iface);
- TRACE("iface %p, origin {%.8e, %.8e}, layout %p, brush %p, options %#x.\n",
- iface, origin.x, origin.y, layout, brush, options);
+ TRACE("iface %p, origin %s, layout %p, brush %p, options %#x.\n",
+ iface, debug_d2d_point_2f(&origin), layout, brush, options);
ID2D1RenderTarget_DrawTextLayout(render_target->dxgi_target, origin, layout, brush, options);
}
@@ -405,8 +405,8 @@ static void STDMETHODCALLTYPE d2d_dc_render_target_DrawGlyphRun(ID2D1DCRenderTar
{
struct d2d_dc_render_target *render_target = impl_from_ID2D1DCRenderTarget(iface);
- TRACE("iface %p, baseline_origin {%.8e, %.8e}, glyph_run %p, brush %p, measuring_mode %#x.\n",
- iface, baseline_origin.x, baseline_origin.y, glyph_run, brush, measuring_mode);
+ TRACE("iface %p, baseline_origin %s, glyph_run %p, brush %p, measuring_mode %#x.\n",
+ iface, debug_d2d_point_2f(&baseline_origin), glyph_run, brush, measuring_mode);
ID2D1RenderTarget_DrawGlyphRun(render_target->dxgi_target,
baseline_origin, glyph_run, brush, measuring_mode);
diff --git a/dlls/d2d1/device.c b/dlls/d2d1/device.c
index be8b7eab032..5e6655feba2 100644
--- a/dlls/d2d1/device.c
+++ b/dlls/d2d1/device.c
@@ -550,8 +550,8 @@ static void STDMETHODCALLTYPE d2d_device_context_DrawLine(ID2D1DeviceContext *if
ID2D1GeometrySink *sink;
HRESULT hr;
- TRACE("iface %p, p0 {%.8e, %.8e}, p1 {%.8e, %.8e}, brush %p, stroke_width %.8e, stroke_style %p.\n",
- iface, p0.x, p0.y, p1.x, p1.y, brush, stroke_width, stroke_style);
+ TRACE("iface %p, p0 %s, p1 %s, brush %p, stroke_width %.8e, stroke_style %p.\n",
+ iface, debug_d2d_point_2f(&p0), debug_d2d_point_2f(&p1), brush, stroke_width, stroke_style);
if (FAILED(hr = ID2D1Factory_CreatePathGeometry(render_target->factory, &geometry)))
{
@@ -1108,8 +1108,8 @@ static void STDMETHODCALLTYPE d2d_device_context_DrawTextLayout(ID2D1DeviceConte
struct d2d_draw_text_layout_ctx ctx;
HRESULT hr;
- TRACE("iface %p, origin {%.8e, %.8e}, layout %p, brush %p, options %#x.\n",
- iface, origin.x, origin.y, layout, brush, options);
+ TRACE("iface %p, origin %s, layout %p, brush %p, options %#x.\n",
+ iface, debug_d2d_point_2f(&origin), layout, brush, options);
ctx.brush = brush;
ctx.options = options;
@@ -1324,8 +1324,8 @@ static void STDMETHODCALLTYPE d2d_device_context_DrawGlyphRun(ID2D1DeviceContext
DWRITE_RENDERING_MODE rendering_mode;
HRESULT hr;
- TRACE("iface %p, baseline_origin {%.8e, %.8e}, glyph_run %p, brush %p, measuring_mode %#x.\n",
- iface, baseline_origin.x, baseline_origin.y, glyph_run, brush, measuring_mode);
+ TRACE("iface %p, baseline_origin %s, glyph_run %p, brush %p, measuring_mode %#x.\n",
+ iface, debug_d2d_point_2f(&baseline_origin), glyph_run, brush, measuring_mode);
rendering_params = render_target->text_rendering_params ? render_target->text_rendering_params
: render_target->default_text_rendering_params;
@@ -1945,8 +1945,8 @@ static HRESULT STDMETHODCALLTYPE d2d_device_context_GetGlyphRunWorldBounds(ID2D1
D2D1_POINT_2F baseline_origin, const DWRITE_GLYPH_RUN *glyph_run,
DWRITE_MEASURING_MODE measuring_mode, D2D1_RECT_F *bounds)
{
- FIXME("iface %p, baseline_origin {%.8e, %.8e}, glyph_run %p, measuring_mode %#x, bounds %p stub!\n", iface,
- baseline_origin.x, baseline_origin.y, glyph_run, measuring_mode, bounds);
+ FIXME("iface %p, baseline_origin %s, glyph_run %p, measuring_mode %#x, bounds %p stub!\n",
+ iface, debug_d2d_point_2f(&baseline_origin), glyph_run, measuring_mode, bounds);
return E_NOTIMPL;
}
@@ -2012,23 +2012,24 @@ static void STDMETHODCALLTYPE d2d_device_context_ID2D1DeviceContext_DrawGlyphRun
D2D1_POINT_2F baseline_origin, const DWRITE_GLYPH_RUN *glyph_run,
const DWRITE_GLYPH_RUN_DESCRIPTION *glyph_run_desc, ID2D1Brush *brush, DWRITE_MEASURING_MODE measuring_mode)
{
- FIXME("iface %p, baseline_origin {%.8e, %.8e}, glyph_run %p, "
- "glyph_run_desc %p, brush %p, measuring_mode %#x stub!\n",
- iface, baseline_origin.x, baseline_origin.y, glyph_run, glyph_run_desc, brush, measuring_mode);
+ FIXME("iface %p, baseline_origin %s, glyph_run %p, glyph_run_desc %p, brush %p, measuring_mode %#x stub!\n",
+ iface, debug_d2d_point_2f(&baseline_origin), glyph_run, glyph_run_desc, brush, measuring_mode);
}
static void STDMETHODCALLTYPE d2d_device_context_DrawImage(ID2D1DeviceContext *iface, ID2D1Image *image,
const D2D1_POINT_2F *target_offset, const D2D1_RECT_F *image_rect, D2D1_INTERPOLATION_MODE interpolation_mode,
D2D1_COMPOSITE_MODE composite_mode)
{
- FIXME("iface %p, image %p, target_offset %p, image_rect %s, interpolation_mode %#x, composite_mode %#x stub!\n",
- iface, image, target_offset, debug_d2d_rect_f(image_rect), interpolation_mode, composite_mode);
+ FIXME("iface %p, image %p, target_offset %s, image_rect %s, interpolation_mode %#x, composite_mode %#x stub!\n",
+ iface, image, debug_d2d_point_2f(target_offset), debug_d2d_rect_f(image_rect),
+ interpolation_mode, composite_mode);
}
static void STDMETHODCALLTYPE d2d_device_context_DrawGdiMetafile(ID2D1DeviceContext *iface,
ID2D1GdiMetafile *metafile, const D2D1_POINT_2F *target_offset)
{
- FIXME("iface %p, metafile %p, target_offset %p stub!\n", iface, metafile, target_offset);
+ FIXME("iface %p, metafile %p, target_offset %s stub!\n",
+ iface, metafile, debug_d2d_point_2f(target_offset));
}
static void STDMETHODCALLTYPE d2d_device_context_ID2D1DeviceContext_DrawBitmap(ID2D1DeviceContext *iface,
diff --git a/dlls/d2d1/factory.c b/dlls/d2d1/factory.c
index 29038ec91ee..2459b58c03d 100644
--- a/dlls/d2d1/factory.c
+++ b/dlls/d2d1/factory.c
@@ -577,7 +577,7 @@ void WINAPI D2D1MakeRotateMatrix(float angle, D2D1_POINT_2F center, D2D1_MATRIX_
{
float theta, sin_theta, cos_theta;
- TRACE("angle %.8e, center {%.8e, %.8e}, matrix %p.\n", angle, center.x, center.y, matrix);
+ TRACE("angle %.8e, center %s, matrix %p.\n", angle, debug_d2d_point_2f(¢er), matrix);
theta = angle * (M_PI / 180.0f);
sin_theta = sinf(theta);
diff --git a/dlls/d2d1/geometry.c b/dlls/d2d1/geometry.c
index d716fb128d7..421ba2b5515 100644
--- a/dlls/d2d1/geometry.c
+++ b/dlls/d2d1/geometry.c
@@ -2419,8 +2419,8 @@ static void STDMETHODCALLTYPE d2d_geometry_sink_BeginFigure(ID2D1GeometrySink *i
struct d2d_geometry *geometry = impl_from_ID2D1GeometrySink(iface);
struct d2d_figure *figure;
- TRACE("iface %p, start_point {%.8e, %.8e}, figure_begin %#x.\n",
- iface, start_point.x, start_point.y, figure_begin);
+ TRACE("iface %p, start_point %s, figure_begin %#x.\n",
+ iface, debug_d2d_point_2f(&start_point), figure_begin);
if (geometry->u.path.state != D2D_GEOMETRY_STATE_OPEN)
{
@@ -2882,7 +2882,7 @@ done:
static void STDMETHODCALLTYPE d2d_geometry_sink_AddLine(ID2D1GeometrySink *iface, D2D1_POINT_2F point)
{
- TRACE("iface %p, point {%.8e, %.8e}.\n", iface, point.x, point.y);
+ TRACE("iface %p, point %s.\n", iface, debug_d2d_point_2f(&point));
d2d_geometry_sink_AddLines(iface, &point, 1);
}
@@ -3164,9 +3164,9 @@ static HRESULT STDMETHODCALLTYPE d2d_path_geometry_StrokeContainsPoint(ID2D1Path
D2D1_POINT_2F point, float stroke_width, ID2D1StrokeStyle *stroke_style, const D2D1_MATRIX_3X2_F *transform,
float tolerance, BOOL *contains)
{
- FIXME("iface %p, point {%.8e, %.8e}, stroke_width %.8e, stroke_style %p, "
+ FIXME("iface %p, point %s, stroke_width %.8e, stroke_style %p, "
"transform %p, tolerance %.8e, contains %p stub!\n",
- iface, point.x, point.y, stroke_width, stroke_style, transform, tolerance, contains);
+ iface, debug_d2d_point_2f(&point), stroke_width, stroke_style, transform, tolerance, contains);
return E_NOTIMPL;
}
@@ -3177,8 +3177,8 @@ static HRESULT STDMETHODCALLTYPE d2d_path_geometry_FillContainsPoint(ID2D1PathGe
struct d2d_geometry *geometry = impl_from_ID2D1PathGeometry(iface);
D2D1_MATRIX_3X2_F g_i;
- TRACE("iface %p, point {%.8e, %.8e}, transform %p, tolerance %.8e, contains %p.\n",
- iface, point.x, point.y, transform, tolerance, contains);
+ TRACE("iface %p, point %s, transform %p, tolerance %.8e, contains %p.\n",
+ iface, debug_d2d_point_2f(&point), transform, tolerance, contains);
if (transform)
{
@@ -3609,9 +3609,8 @@ static HRESULT STDMETHODCALLTYPE d2d_rectangle_geometry_StrokeContainsPoint(ID2D
D2D1_POINT_2F point, float stroke_width, ID2D1StrokeStyle *stroke_style, const D2D1_MATRIX_3X2_F *transform,
float tolerance, BOOL *contains)
{
- FIXME("iface %p, point {%.8e, %.8e}, stroke_width %.8e, stroke_style %p, "
- "transform %p, tolerance %.8e, contains %p stub!\n",
- iface, point.x, point.y, stroke_width, stroke_style, transform, tolerance, contains);
+ FIXME("iface %p, point %s, stroke_width %.8e, stroke_style %p, transform %p, tolerance %.8e, contains %p stub!\n",
+ iface, debug_d2d_point_2f(&point), stroke_width, stroke_style, transform, tolerance, contains);
return E_NOTIMPL;
}
@@ -3623,8 +3622,8 @@ static HRESULT STDMETHODCALLTYPE d2d_rectangle_geometry_FillContainsPoint(ID2D1R
D2D1_RECT_F *rect = &geometry->u.rectangle.rect;
float dx, dy;
- TRACE("iface %p, point {%.8e, %.8e}, transform %p, tolerance %.8e, contains %p.\n",
- iface, point.x, point.y, transform, tolerance, contains);
+ TRACE("iface %p, point %s, transform %p, tolerance %.8e, contains %p.\n",
+ iface, debug_d2d_point_2f(&point), transform, tolerance, contains);
if (transform)
{
@@ -3939,9 +3938,8 @@ static HRESULT STDMETHODCALLTYPE d2d_transformed_geometry_StrokeContainsPoint(ID
struct d2d_geometry *geometry = impl_from_ID2D1TransformedGeometry(iface);
D2D1_MATRIX_3X2_F g;
- TRACE("iface %p, point {%.8e, %.8e}, stroke_width %.8e, stroke_style %p, "
- "transform %p, tolerance %.8e, contains %p.\n",
- iface, point.x, point.y, stroke_width, stroke_style, transform, tolerance, contains);
+ TRACE("iface %p, point %s, stroke_width %.8e, stroke_style %p, transform %p, tolerance %.8e, contains %p.\n",
+ iface, debug_d2d_point_2f(&point), stroke_width, stroke_style, transform, tolerance, contains);
g = geometry->transform;
if (transform)
@@ -3957,8 +3955,8 @@ static HRESULT STDMETHODCALLTYPE d2d_transformed_geometry_FillContainsPoint(ID2D
struct d2d_geometry *geometry = impl_from_ID2D1TransformedGeometry(iface);
D2D1_MATRIX_3X2_F g;
- TRACE("iface %p, point {%.8e, %.8e}, transform %p, tolerance %.8e, contains %p.\n",
- iface, point.x, point.y, transform, tolerance, contains);
+ TRACE("iface %p, point %s, transform %p, tolerance %.8e, contains %p.\n",
+ iface, debug_d2d_point_2f(&point), transform, tolerance, contains);
g = geometry->transform;
if (transform)
diff --git a/dlls/d2d1/hwnd_render_target.c b/dlls/d2d1/hwnd_render_target.c
index 2c9481e5768..9b8771f895d 100644
--- a/dlls/d2d1/hwnd_render_target.c
+++ b/dlls/d2d1/hwnd_render_target.c
@@ -233,8 +233,8 @@ static void STDMETHODCALLTYPE d2d_hwnd_render_target_DrawLine(ID2D1HwndRenderTar
{
struct d2d_hwnd_render_target *render_target = impl_from_ID2D1HwndRenderTarget(iface);
- TRACE("iface %p, p0 {%.8e, %.8e}, p1 {%.8e, %.8e}, brush %p, stroke_width %.8e, stroke_style %p.\n",
- iface, p0.x, p0.y, p1.x, p1.y, brush, stroke_width, stroke_style);
+ TRACE("iface %p, p0 %s, p1 %s, brush %p, stroke_width %.8e, stroke_style %p.\n",
+ iface, debug_d2d_point_2f(&p0), debug_d2d_point_2f(&p1), brush, stroke_width, stroke_style);
ID2D1RenderTarget_DrawLine(render_target->dxgi_target, p0, p1, brush, stroke_width, stroke_style);
}
@@ -379,8 +379,8 @@ static void STDMETHODCALLTYPE d2d_hwnd_render_target_DrawTextLayout(ID2D1HwndRen
{
struct d2d_hwnd_render_target *render_target = impl_from_ID2D1HwndRenderTarget(iface);
- TRACE("iface %p, origin {%.8e, %.8e}, layout %p, brush %p, options %#x.\n",
- iface, origin.x, origin.y, layout, brush, options);
+ TRACE("iface %p, origin %s, layout %p, brush %p, options %#x.\n",
+ iface, debug_d2d_point_2f(&origin), layout, brush, options);
ID2D1RenderTarget_DrawTextLayout(render_target->dxgi_target, origin, layout, brush, options);
}
@@ -391,8 +391,8 @@ static void STDMETHODCALLTYPE d2d_hwnd_render_target_DrawGlyphRun(ID2D1HwndRende
{
struct d2d_hwnd_render_target *render_target = impl_from_ID2D1HwndRenderTarget(iface);
- TRACE("iface %p, baseline_origin {%.8e, %.8e}, glyph_run %p, brush %p, measuring_mode %#x.\n",
- iface, baseline_origin.x, baseline_origin.y, glyph_run, brush, measuring_mode);
+ TRACE("iface %p, baseline_origin %s, glyph_run %p, brush %p, measuring_mode %#x.\n",
+ iface, debug_d2d_point_2f(&baseline_origin), glyph_run, brush, measuring_mode);
ID2D1RenderTarget_DrawGlyphRun(render_target->dxgi_target,
baseline_origin, glyph_run, brush, measuring_mode);
--
2.11.0
1
0
[PATCH 1/4] devenum: Factor friendly name and CLSID registration into register_codec().
by Zebediah Figura 24 Sep '18
by Zebediah Figura 24 Sep '18
24 Sep '18
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/devenum/createdevenum.c | 307 ++++++++++++++-----------------------------
1 file changed, 98 insertions(+), 209 deletions(-)
diff --git a/dlls/devenum/createdevenum.c b/dlls/devenum/createdevenum.c
index 8fbf323..ad1022e 100644
--- a/dlls/devenum/createdevenum.c
+++ b/dlls/devenum/createdevenum.c
@@ -104,11 +104,16 @@ static ULONG WINAPI DEVENUM_ICreateDevEnum_Release(ICreateDevEnum * iface)
return 1; /* non-heap based object */
}
-static HRESULT register_codec(const CLSID *class, const WCHAR *name, IMoniker **ret)
+static HRESULT register_codec(const GUID *class, const WCHAR *name,
+ const GUID *clsid, const WCHAR *friendly_name, IPropertyBag **ret)
{
static const WCHAR deviceW[] = {'@','d','e','v','i','c','e',':','c','m',':',0};
+ WCHAR guidstr[CHARS_IN_GUID];
IParseDisplayName *parser;
+ IPropertyBag *propbag;
+ IMoniker *mon;
WCHAR *buffer;
+ VARIANT var;
ULONG eaten;
HRESULT hr;
@@ -128,10 +133,36 @@ static HRESULT register_codec(const CLSID *class, const WCHAR *name, IMoniker **
strcatW(buffer, backslashW);
strcatW(buffer, name);
- hr = IParseDisplayName_ParseDisplayName(parser, NULL, buffer, &eaten, ret);
+ IParseDisplayName_ParseDisplayName(parser, NULL, buffer, &eaten, &mon);
IParseDisplayName_Release(parser);
heap_free(buffer);
- return hr;
+
+ IMoniker_BindToStorage(mon, NULL, NULL, &IID_IPropertyBag, (void **)&propbag);
+ IMoniker_Release(mon);
+
+ V_VT(&var) = VT_BSTR;
+ V_BSTR(&var) = SysAllocString(friendly_name);
+ hr = IPropertyBag_Write(propbag, wszFriendlyName, &var);
+ VariantClear(&var);
+ if (FAILED(hr))
+ {
+ IPropertyBag_Release(propbag);
+ return hr;
+ }
+
+ V_VT(&var) = VT_BSTR;
+ StringFromGUID2(clsid, guidstr, ARRAY_SIZE(guidstr));
+ V_BSTR(&var) = SysAllocString(guidstr);
+ hr = IPropertyBag_Write(propbag, clsidW, &var);
+ VariantClear(&var);
+ if (FAILED(hr))
+ {
+ IPropertyBag_Release(propbag);
+ return hr;
+ }
+
+ *ret = propbag;
+ return S_OK;
}
static void DEVENUM_ReadPinTypes(HKEY hkeyPinKey, REGFILTERPINS2 *rgPin)
@@ -412,15 +443,18 @@ static void register_legacy_filters(void)
IPropertyBag *prop_bag = NULL;
WCHAR wszRegKey[MAX_PATH];
HKEY classkey = NULL;
- IMoniker *mon = NULL;
- VARIANT var = {};
REGFILTER2 rgf2;
DWORD Type, len;
+ GUID clsid;
if (RegEnumKeyExW(hkeyFilter, i, wszFilterSubkeyName, &cName, NULL, NULL, NULL, NULL) != ERROR_SUCCESS) continue;
TRACE("Registering %s\n", debugstr_w(wszFilterSubkeyName));
+ hr = CLSIDFromString(wszFilterSubkeyName, &clsid);
+ if (FAILED(hr))
+ continue;
+
strcpyW(wszRegKey, clsidW);
strcatW(wszRegKey, backslashW);
strcatW(wszRegKey, wszFilterSubkeyName);
@@ -428,40 +462,30 @@ static void register_legacy_filters(void)
if (RegOpenKeyExW(HKEY_CLASSES_ROOT, wszRegKey, 0, KEY_READ, &classkey) != ERROR_SUCCESS)
continue;
- hr = register_codec(&CLSID_LegacyAmFilterCategory, wszFilterSubkeyName, &mon);
- if (FAILED(hr)) goto cleanup;
-
- hr = IMoniker_BindToStorage(mon, NULL, NULL, &IID_IPropertyBag, (void **)&prop_bag);
- if (FAILED(hr)) goto cleanup;
-
- /* write friendly name */
len = 0;
- V_VT(&var) = VT_BSTR;
if (!RegQueryValueExW(classkey, NULL, NULL, &Type, NULL, &len))
{
WCHAR *friendlyname = heap_alloc(len);
if (!friendlyname)
- goto cleanup;
+ {
+ RegCloseKey(classkey);
+ continue;
+ }
RegQueryValueExW(classkey, NULL, NULL, &Type, (BYTE *)friendlyname, &len);
- V_BSTR(&var) = SysAllocStringLen(friendlyname, len/sizeof(WCHAR));
+
+ hr = register_codec(&CLSID_LegacyAmFilterCategory, wszFilterSubkeyName,
+ &clsid, friendlyname, &prop_bag);
+
heap_free(friendlyname);
}
else
- V_BSTR(&var) = SysAllocString(wszFilterSubkeyName);
-
- if (!V_BSTR(&var))
- goto cleanup;
- hr = IPropertyBag_Write(prop_bag, wszFriendlyName, &var);
- if (FAILED(hr)) goto cleanup;
- VariantClear(&var);
-
- /* write clsid */
- V_VT(&var) = VT_BSTR;
- if (!(V_BSTR(&var) = SysAllocString(wszFilterSubkeyName)))
- goto cleanup;
- hr = IPropertyBag_Write(prop_bag, clsidW, &var);
- if (FAILED(hr)) goto cleanup;
- VariantClear(&var);
+ hr = register_codec(&CLSID_LegacyAmFilterCategory, wszFilterSubkeyName,
+ &clsid, wszFilterSubkeyName, &prop_bag);
+ if (FAILED(hr))
+ {
+ RegCloseKey(classkey);
+ continue;
+ }
/* write filter data */
rgf2.dwMerit = MERIT_NORMAL;
@@ -473,11 +497,8 @@ static void register_legacy_filters(void)
write_filter_data(prop_bag, &rgf2);
-cleanup:
- if (prop_bag) IPropertyBag_Release(prop_bag);
- if (mon) IMoniker_Release(mon);
+ IPropertyBag_Release(prop_bag);
RegCloseKey(classkey);
- VariantClear(&var);
free_regfilter2(&rgf2);
}
}
@@ -495,50 +516,30 @@ static BOOL CALLBACK register_dsound_devices(GUID *guid, const WCHAR *desc, cons
REGPINTYPES rgtypes = {0};
REGFILTER2 rgf = {0};
WCHAR clsid[CHARS_IN_GUID];
- IMoniker *mon = NULL;
VARIANT var;
HRESULT hr;
hr = DEVENUM_CreateAMCategoryKey(&CLSID_AudioRendererCategory);
- if (FAILED(hr)) goto cleanup;
+ if (FAILED(hr))
+ return FALSE;
- V_VT(&var) = VT_BSTR;
if (guid)
{
WCHAR *name = heap_alloc(sizeof(defaultW) + strlenW(desc) * sizeof(WCHAR));
if (!name)
- goto cleanup;
+ return FALSE;
strcpyW(name, directsoundW);
strcatW(name, desc);
- V_BSTR(&var) = SysAllocString(name);
+ hr = register_codec(&CLSID_AudioRendererCategory, name,
+ &CLSID_DSoundRender, name, &prop_bag);
heap_free(name);
}
else
- V_BSTR(&var) = SysAllocString(defaultW);
-
- if (!V_BSTR(&var))
- goto cleanup;
-
- hr = register_codec(&CLSID_AudioRendererCategory, V_BSTR(&var), &mon);
- if (FAILED(hr)) goto cleanup;
-
- hr = IMoniker_BindToStorage(mon, NULL, NULL, &IID_IPropertyBag, (void **)&prop_bag);
- if (FAILED(hr)) goto cleanup;
-
- /* write friendly name */
- hr = IPropertyBag_Write(prop_bag, wszFriendlyName, &var);
- if (FAILED(hr)) goto cleanup;
- VariantClear(&var);
-
- /* write clsid */
- V_VT(&var) = VT_BSTR;
- StringFromGUID2(&CLSID_DSoundRender, clsid, CHARS_IN_GUID);
- if (!(V_BSTR(&var) = SysAllocString(clsid)))
- goto cleanup;
- hr = IPropertyBag_Write(prop_bag, clsidW, &var);
- if (FAILED(hr)) goto cleanup;
- VariantClear(&var);
+ hr = register_codec(&CLSID_AudioRendererCategory, defaultW,
+ &CLSID_DSoundRender, defaultW, &prop_bag);
+ if (FAILED(hr))
+ return FALSE;
/* write filter data */
rgf.dwVersion = 2;
@@ -557,16 +558,11 @@ static BOOL CALLBACK register_dsound_devices(GUID *guid, const WCHAR *desc, cons
/* write DSound guid */
V_VT(&var) = VT_BSTR;
StringFromGUID2(guid ? guid : &GUID_NULL, clsid, CHARS_IN_GUID);
- if (!(V_BSTR(&var) = SysAllocString(clsid)))
- goto cleanup;
- hr = IPropertyBag_Write(prop_bag, dsguidW, &var);
- if (FAILED(hr)) goto cleanup;
+ if ((V_BSTR(&var) = SysAllocString(clsid)))
+ hr = IPropertyBag_Write(prop_bag, dsguidW, &var);
-cleanup:
VariantClear(&var);
- if (prop_bag) IPropertyBag_Release(prop_bag);
- if (mon) IMoniker_Release(mon);
-
+ IPropertyBag_Release(prop_bag);
return TRUE;
}
@@ -578,9 +574,8 @@ static void register_waveout_devices(void)
REGFILTERPINS2 rgpins = {0};
REGPINTYPES rgtypes = {0};
REGFILTER2 rgf = {0};
- WCHAR clsid[CHARS_IN_GUID];
- IMoniker *mon = NULL;
WAVEOUTCAPSW caps;
+ const WCHAR *name;
int i, count;
VARIANT var;
HRESULT hr;
@@ -594,34 +589,12 @@ static void register_waveout_devices(void)
{
waveOutGetDevCapsW(i, &caps, sizeof(caps));
- V_VT(&var) = VT_BSTR;
+ name = (i == -1) ? defaultW : caps.szPname;
- if (i == -1) /* WAVE_MAPPER */
- V_BSTR(&var) = SysAllocString(defaultW);
- else
- V_BSTR(&var) = SysAllocString(caps.szPname);
- if (!(V_BSTR(&var)))
- goto cleanup;
-
- hr = register_codec(&CLSID_AudioRendererCategory, V_BSTR(&var), &mon);
- if (FAILED(hr)) goto cleanup;
-
- hr = IMoniker_BindToStorage(mon, NULL, NULL, &IID_IPropertyBag, (void **)&prop_bag);
- if (FAILED(hr)) goto cleanup;
-
- /* write friendly name */
- hr = IPropertyBag_Write(prop_bag, wszFriendlyName, &var);
- if (FAILED(hr)) goto cleanup;
- VariantClear(&var);
-
- /* write clsid */
- V_VT(&var) = VT_BSTR;
- StringFromGUID2(&CLSID_AudioRender, clsid, CHARS_IN_GUID);
- if (!(V_BSTR(&var) = SysAllocString(clsid)))
- goto cleanup;
- hr = IPropertyBag_Write(prop_bag, clsidW, &var);
- if (FAILED(hr)) goto cleanup;
- VariantClear(&var);
+ hr = register_codec(&CLSID_AudioRendererCategory, name,
+ &CLSID_AudioRender, name, &prop_bag);
+ if (FAILED(hr))
+ continue;
/* write filter data */
rgf.dwVersion = 2;
@@ -639,13 +612,10 @@ static void register_waveout_devices(void)
/* write WaveOutId */
V_VT(&var) = VT_I4;
V_I4(&var) = i;
- hr = IPropertyBag_Write(prop_bag, waveoutidW, &var);
- if (FAILED(hr)) goto cleanup;
+ IPropertyBag_Write(prop_bag, waveoutidW, &var);
-cleanup:
VariantClear(&var);
if (prop_bag) IPropertyBag_Release(prop_bag);
- if (mon) IMoniker_Release(mon);
}
}
@@ -654,8 +624,6 @@ static void register_wavein_devices(void)
static const WCHAR waveinidW[] = {'W','a','v','e','I','n','I','d',0};
IPropertyBag *prop_bag = NULL;
REGFILTER2 rgf = {0};
- WCHAR clsid[CHARS_IN_GUID];
- IMoniker *mon = NULL;
WAVEINCAPSW caps;
int i, count;
VARIANT var;
@@ -670,31 +638,10 @@ static void register_wavein_devices(void)
{
waveInGetDevCapsW(i, &caps, sizeof(caps));
- V_VT(&var) = VT_BSTR;
-
- V_BSTR(&var) = SysAllocString(caps.szPname);
- if (!(V_BSTR(&var)))
- goto cleanup;
-
- hr = register_codec(&CLSID_AudioInputDeviceCategory, V_BSTR(&var), &mon);
- if (FAILED(hr)) goto cleanup;
-
- hr = IMoniker_BindToStorage(mon, NULL, NULL, &IID_IPropertyBag, (void **)&prop_bag);
- if (FAILED(hr)) goto cleanup;
-
- /* write friendly name */
- hr = IPropertyBag_Write(prop_bag, wszFriendlyName, &var);
- if (FAILED(hr)) goto cleanup;
- VariantClear(&var);
-
- /* write clsid */
- V_VT(&var) = VT_BSTR;
- StringFromGUID2(&CLSID_AudioRecord, clsid, CHARS_IN_GUID);
- if (!(V_BSTR(&var) = SysAllocString(clsid)))
- goto cleanup;
- hr = IPropertyBag_Write(prop_bag, clsidW, &var);
- if (FAILED(hr)) goto cleanup;
- VariantClear(&var);
+ hr = register_codec(&CLSID_AudioInputDeviceCategory, caps.szPname,
+ &CLSID_AudioRecord, caps.szPname, &prop_bag);
+ if (FAILED(hr))
+ continue;
/* write filter data */
rgf.dwVersion = 2;
@@ -705,13 +652,10 @@ static void register_wavein_devices(void)
/* write WaveInId */
V_VT(&var) = VT_I4;
V_I4(&var) = i;
- hr = IPropertyBag_Write(prop_bag, waveinidW, &var);
- if (FAILED(hr)) goto cleanup;
+ IPropertyBag_Write(prop_bag, waveinidW, &var);
-cleanup:
VariantClear(&var);
- if (prop_bag) IPropertyBag_Release(prop_bag);
- if (mon) IMoniker_Release(mon);
+ IPropertyBag_Release(prop_bag);
}
}
@@ -723,9 +667,8 @@ static void register_midiout_devices(void)
REGFILTERPINS2 rgpins = {0};
REGPINTYPES rgtypes = {0};
REGFILTER2 rgf = {0};
- WCHAR clsid[CHARS_IN_GUID];
- IMoniker *mon = NULL;
MIDIOUTCAPSW caps;
+ const WCHAR *name;
int i, count;
VARIANT var;
HRESULT hr;
@@ -739,34 +682,12 @@ static void register_midiout_devices(void)
{
midiOutGetDevCapsW(i, &caps, sizeof(caps));
- V_VT(&var) = VT_BSTR;
+ name = (i == -1) ? defaultW : caps.szPname;
- if (i == -1) /* MIDI_MAPPER */
- V_BSTR(&var) = SysAllocString(defaultW);
- else
- V_BSTR(&var) = SysAllocString(caps.szPname);
- if (!(V_BSTR(&var)))
- goto cleanup;
-
- hr = register_codec(&CLSID_MidiRendererCategory, V_BSTR(&var), &mon);
- if (FAILED(hr)) goto cleanup;
-
- hr = IMoniker_BindToStorage(mon, NULL, NULL, &IID_IPropertyBag, (void **)&prop_bag);
- if (FAILED(hr)) goto cleanup;
-
- /* write friendly name */
- hr = IPropertyBag_Write(prop_bag, wszFriendlyName, &var);
- if (FAILED(hr)) goto cleanup;
- VariantClear(&var);
-
- /* write clsid */
- V_VT(&var) = VT_BSTR;
- StringFromGUID2(&CLSID_AVIMIDIRender, clsid, CHARS_IN_GUID);
- if (!(V_BSTR(&var) = SysAllocString(clsid)))
- goto cleanup;
- hr = IPropertyBag_Write(prop_bag, clsidW, &var);
- if (FAILED(hr)) goto cleanup;
- VariantClear(&var);
+ hr = register_codec(&CLSID_MidiRendererCategory, name,
+ &CLSID_AVIMIDIRender, name, &prop_bag);
+ if (FAILED(hr))
+ continue;
/* write filter data */
rgf.dwVersion = 2;
@@ -784,13 +705,10 @@ static void register_midiout_devices(void)
/* write MidiOutId */
V_VT(&var) = VT_I4;
V_I4(&var) = i;
- hr = IPropertyBag_Write(prop_bag, midioutidW, &var);
- if (FAILED(hr)) goto cleanup;
+ IPropertyBag_Write(prop_bag, midioutidW, &var);
-cleanup:
VariantClear(&var);
- if (prop_bag) IPropertyBag_Release(prop_bag);
- if (mon) IMoniker_Release(mon);
+ IPropertyBag_Release(prop_bag);
}
}
@@ -801,8 +719,6 @@ static void register_vfw_codecs(void)
IPropertyBag *prop_bag = NULL;
REGPINTYPES rgtypes[2];
REGFILTER2 rgf;
- WCHAR clsid[CHARS_IN_GUID];
- IMoniker *mon = NULL;
GUID typeguid;
ICINFO info;
VARIANT var;
@@ -822,40 +738,10 @@ static void register_vfw_codecs(void)
ICGetInfo(hic, &info, sizeof(info));
ICClose(hic);
- V_VT(&var) = VT_BSTR;
-
- V_BSTR(&var) = SysAllocString(name);
- if (!(V_BSTR(&var)))
- goto cleanup;
-
- hr = register_codec(&CLSID_VideoCompressorCategory, V_BSTR(&var), &mon);
- if (FAILED(hr)) goto cleanup;
-
- hr = IMoniker_BindToStorage(mon, NULL, NULL, &IID_IPropertyBag, (void **)&prop_bag);
- if (FAILED(hr)) goto cleanup;
-
- /* write WaveInId */
- hr = IPropertyBag_Write(prop_bag, fcchandlerW, &var);
- if (FAILED(hr)) goto cleanup;
- VariantClear(&var);
-
- /* write friendly name */
- V_VT(&var) = VT_BSTR;
- if (!(V_BSTR(&var) = SysAllocString(info.szDescription)))
- goto cleanup;
-
- hr = IPropertyBag_Write(prop_bag, wszFriendlyName, &var);
- if (FAILED(hr)) goto cleanup;
- VariantClear(&var);
-
- /* write clsid */
- V_VT(&var) = VT_BSTR;
- StringFromGUID2(&CLSID_AVICo, clsid, CHARS_IN_GUID);
- if (!(V_BSTR(&var) = SysAllocString(clsid)))
- goto cleanup;
- hr = IPropertyBag_Write(prop_bag, clsidW, &var);
- if (FAILED(hr)) goto cleanup;
- VariantClear(&var);
+ hr = register_codec(&CLSID_VideoCompressorCategory, name,
+ &CLSID_AVICo, info.szDescription, &prop_bag);
+ if (FAILED(hr))
+ continue;
/* write filter data */
rgf.dwVersion = 2;
@@ -877,10 +763,13 @@ static void register_vfw_codecs(void)
write_filter_data(prop_bag, &rgf);
-cleanup:
+ /* write WaveInId */
+ V_VT(&var) = VT_BSTR;
+ V_BSTR(&var) = SysAllocString(name);
+ IPropertyBag_Write(prop_bag, fcchandlerW, &var);
+
VariantClear(&var);
- if (prop_bag) IPropertyBag_Release(prop_bag);
- if (mon) IMoniker_Release(mon);
+ IPropertyBag_Release(prop_bag);
}
}
--
2.7.4
2
4
Signed-off-by: Alex Henrie <alexhenrie24(a)gmail.com>
---
dlls/riched20/txthost.c | 86 ++++++++++++++++++++---------------------
dlls/riched20/txtsrv.c | 4 +-
2 files changed, 45 insertions(+), 45 deletions(-)
diff --git a/dlls/riched20/txthost.c b/dlls/riched20/txthost.c
index b479bde81b..d929a1a0a3 100644
--- a/dlls/riched20/txthost.c
+++ b/dlls/riched20/txthost.c
@@ -501,9 +501,9 @@ DECLSPEC_HIDDEN HRESULT WINAPI ITextHostImpl_TxGetSelectionBarWidth(ITextHost *i
#ifdef __i386__ /* thiscall functions are i386-specific */
-#define THISCALL(func) __thiscall_ ## func
+#define THISCALL(func) (void *) __thiscall_ ## func
#define DEFINE_THISCALL_WRAPPER(func,args) \
- extern typeof(func) THISCALL(func); \
+ extern void * __thiscall_ ## func(void); \
__ASM_STDCALL_FUNC(__thiscall_ ## func, args, \
"popl %eax\n\t" \
"pushl %ecx\n\t" \
@@ -559,9 +559,9 @@ DEFINE_THISCALL_WRAPPER(ITextHostImpl_TxGetSelectionBarWidth,8)
#ifdef __i386__ /* thiscall functions are i386-specific */
-#define STDCALL(func) __stdcall_ ## func
+#define STDCALL(func) (void *) __stdcall_ ## func
#define DEFINE_STDCALL_WRAPPER(num,func,args) \
- extern typeof(func) __stdcall_ ## func; \
+ extern void * __stdcall_ ## func(void); \
__ASM_STDCALL_FUNC(__stdcall_ ## func, args, \
"popl %eax\n\t" \
"popl %ecx\n\t" \
@@ -613,45 +613,45 @@ const ITextHostVtbl itextHostStdcallVtbl = {
NULL,
NULL,
NULL,
- __stdcall_ITextHostImpl_TxGetDC,
- __stdcall_ITextHostImpl_TxReleaseDC,
- __stdcall_ITextHostImpl_TxShowScrollBar,
- __stdcall_ITextHostImpl_TxEnableScrollBar,
- __stdcall_ITextHostImpl_TxSetScrollRange,
- __stdcall_ITextHostImpl_TxSetScrollPos,
- __stdcall_ITextHostImpl_TxInvalidateRect,
- __stdcall_ITextHostImpl_TxViewChange,
- __stdcall_ITextHostImpl_TxCreateCaret,
- __stdcall_ITextHostImpl_TxShowCaret,
- __stdcall_ITextHostImpl_TxSetCaretPos,
- __stdcall_ITextHostImpl_TxSetTimer,
- __stdcall_ITextHostImpl_TxKillTimer,
- __stdcall_ITextHostImpl_TxScrollWindowEx,
- __stdcall_ITextHostImpl_TxSetCapture,
- __stdcall_ITextHostImpl_TxSetFocus,
- __stdcall_ITextHostImpl_TxSetCursor,
- __stdcall_ITextHostImpl_TxScreenToClient,
- __stdcall_ITextHostImpl_TxClientToScreen,
- __stdcall_ITextHostImpl_TxActivate,
- __stdcall_ITextHostImpl_TxDeactivate,
- __stdcall_ITextHostImpl_TxGetClientRect,
- __stdcall_ITextHostImpl_TxGetViewInset,
- __stdcall_ITextHostImpl_TxGetCharFormat,
- __stdcall_ITextHostImpl_TxGetParaFormat,
- __stdcall_ITextHostImpl_TxGetSysColor,
- __stdcall_ITextHostImpl_TxGetBackStyle,
- __stdcall_ITextHostImpl_TxGetMaxLength,
- __stdcall_ITextHostImpl_TxGetScrollBars,
- __stdcall_ITextHostImpl_TxGetPasswordChar,
- __stdcall_ITextHostImpl_TxGetAcceleratorPos,
- __stdcall_ITextHostImpl_TxGetExtent,
- __stdcall_ITextHostImpl_OnTxCharFormatChange,
- __stdcall_ITextHostImpl_OnTxParaFormatChange,
- __stdcall_ITextHostImpl_TxGetPropertyBits,
- __stdcall_ITextHostImpl_TxNotify,
- __stdcall_ITextHostImpl_TxImmGetContext,
- __stdcall_ITextHostImpl_TxImmReleaseContext,
- __stdcall_ITextHostImpl_TxGetSelectionBarWidth,
+ STDCALL(ITextHostImpl_TxGetDC),
+ STDCALL(ITextHostImpl_TxReleaseDC),
+ STDCALL(ITextHostImpl_TxShowScrollBar),
+ STDCALL(ITextHostImpl_TxEnableScrollBar),
+ STDCALL(ITextHostImpl_TxSetScrollRange),
+ STDCALL(ITextHostImpl_TxSetScrollPos),
+ STDCALL(ITextHostImpl_TxInvalidateRect),
+ STDCALL(ITextHostImpl_TxViewChange),
+ STDCALL(ITextHostImpl_TxCreateCaret),
+ STDCALL(ITextHostImpl_TxShowCaret),
+ STDCALL(ITextHostImpl_TxSetCaretPos),
+ STDCALL(ITextHostImpl_TxSetTimer),
+ STDCALL(ITextHostImpl_TxKillTimer),
+ STDCALL(ITextHostImpl_TxScrollWindowEx),
+ STDCALL(ITextHostImpl_TxSetCapture),
+ STDCALL(ITextHostImpl_TxSetFocus),
+ STDCALL(ITextHostImpl_TxSetCursor),
+ STDCALL(ITextHostImpl_TxScreenToClient),
+ STDCALL(ITextHostImpl_TxClientToScreen),
+ STDCALL(ITextHostImpl_TxActivate),
+ STDCALL(ITextHostImpl_TxDeactivate),
+ STDCALL(ITextHostImpl_TxGetClientRect),
+ STDCALL(ITextHostImpl_TxGetViewInset),
+ STDCALL(ITextHostImpl_TxGetCharFormat),
+ STDCALL(ITextHostImpl_TxGetParaFormat),
+ STDCALL(ITextHostImpl_TxGetSysColor),
+ STDCALL(ITextHostImpl_TxGetBackStyle),
+ STDCALL(ITextHostImpl_TxGetMaxLength),
+ STDCALL(ITextHostImpl_TxGetScrollBars),
+ STDCALL(ITextHostImpl_TxGetPasswordChar),
+ STDCALL(ITextHostImpl_TxGetAcceleratorPos),
+ STDCALL(ITextHostImpl_TxGetExtent),
+ STDCALL(ITextHostImpl_OnTxCharFormatChange),
+ STDCALL(ITextHostImpl_OnTxParaFormatChange),
+ STDCALL(ITextHostImpl_TxGetPropertyBits),
+ STDCALL(ITextHostImpl_TxNotify),
+ STDCALL(ITextHostImpl_TxImmGetContext),
+ STDCALL(ITextHostImpl_TxImmReleaseContext),
+ STDCALL(ITextHostImpl_TxGetSelectionBarWidth),
};
#endif /* __i386__ */
diff --git a/dlls/riched20/txtsrv.c b/dlls/riched20/txtsrv.c
index ee65621b1d..8cbe77431b 100644
--- a/dlls/riched20/txtsrv.c
+++ b/dlls/riched20/txtsrv.c
@@ -35,9 +35,9 @@
#ifdef __i386__ /* thiscall functions are i386-specific */
-#define THISCALL(func) __thiscall_ ## func
+#define THISCALL(func) (void *) __thiscall_ ## func
#define DEFINE_THISCALL_WRAPPER(func,args) \
- extern typeof(func) THISCALL(func); \
+ extern void * __thiscall_ ## func(void); \
__ASM_STDCALL_FUNC(__thiscall_ ## func, args, \
"popl %eax\n\t" \
"pushl %ecx\n\t" \
--
2.19.0
3
5
24 Sep '18
Signed-off-by: Andrew Eikum <aeikum(a)codeweavers.com>
---
I couldn't find a format specification for this file. It's loaded with
"gdb -x $file", and this change seems to fix it for me with my gdb
installation.
programs/winedbg/gdbproxy.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/programs/winedbg/gdbproxy.c b/programs/winedbg/gdbproxy.c
index 512e0112b9..025cb38131 100644
--- a/programs/winedbg/gdbproxy.c
+++ b/programs/winedbg/gdbproxy.c
@@ -1890,7 +1890,7 @@ static BOOL gdb_exec(const char* wine_path, unsigned port, unsigned flags)
fd = mkstemps(buf, 0);
if (fd == -1) return FALSE;
if ((f = fdopen(fd, "w+")) == NULL) return FALSE;
- fprintf(f, "file %s\n", wine_path);
+ fprintf(f, "file \"%s\"\n", wine_path);
fprintf(f, "target remote localhost:%d\n", ntohs(port));
fprintf(f, "set prompt Wine-gdb>\\ \n");
/* gdb 5.1 seems to require it, won't hurt anyway */
--
2.19.0
1
0
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/d2d1/bitmap_render_target.c | 8 +++-
dlls/d2d1/device.c | 4 +-
dlls/d2d1/tests/d2d1.c | 67 ++++++++++++++++++++++++++++++--
3 files changed, 73 insertions(+), 6 deletions(-)
diff --git a/dlls/d2d1/bitmap_render_target.c b/dlls/d2d1/bitmap_render_target.c
index 57f5b23b51..6cea50972f 100644
--- a/dlls/d2d1/bitmap_render_target.c
+++ b/dlls/d2d1/bitmap_render_target.c
@@ -722,6 +722,11 @@ static const struct ID2D1BitmapRenderTargetVtbl d2d_bitmap_render_target_vtbl =
d2d_bitmap_render_target_GetBitmap
};
+static const struct d2d_device_context_ops d2d_bitmap_render_target_ops =
+{
+ NULL,
+};
+
HRESULT d2d_bitmap_render_target_init(struct d2d_bitmap_render_target *render_target,
const struct d2d_device_context *parent_target, const D2D1_SIZE_F *size,
const D2D1_SIZE_U *pixel_size, const D2D1_PIXEL_FORMAT *pixel_format,
@@ -805,7 +810,8 @@ HRESULT d2d_bitmap_render_target_init(struct d2d_bitmap_render_target *render_ta
}
if (FAILED(hr = d2d_d3d_create_render_target(parent_target->factory, dxgi_surface,
- (IUnknown *)&render_target->ID2D1BitmapRenderTarget_iface, NULL,
+ (IUnknown *)&render_target->ID2D1BitmapRenderTarget_iface,
+ parent_target->ops ? &d2d_bitmap_render_target_ops : NULL,
&dxgi_rt_desc, (void **)&render_target->dxgi_inner)))
{
WARN("Failed to create DXGI surface render target, hr %#x.\n", hr);
diff --git a/dlls/d2d1/device.c b/dlls/d2d1/device.c
index d20377b5c2..f1d0dad45e 100644
--- a/dlls/d2d1/device.c
+++ b/dlls/d2d1/device.c
@@ -1515,7 +1515,7 @@ static HRESULT STDMETHODCALLTYPE d2d_device_context_Flush(ID2D1DeviceContext *if
FIXME("iface %p, tag1 %p, tag2 %p stub!\n", iface, tag1, tag2);
- if (context->ops)
+ if (context->ops && context->ops->device_context_present)
context->ops->device_context_present(context->outer_unknown);
return E_NOTIMPL;
@@ -1693,7 +1693,7 @@ static HRESULT STDMETHODCALLTYPE d2d_device_context_EndDraw(ID2D1DeviceContext *
if (tag2)
*tag2 = context->error.tag2;
- if (context->ops)
+ if (context->ops && context->ops->device_context_present)
{
if (FAILED(hr = context->ops->device_context_present(context->outer_unknown)))
context->error.code = hr;
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 4136b69885..9e6ce06543 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -6705,8 +6705,10 @@ static void check_rt_bitmap_surface_(unsigned int line, ID2D1RenderTarget *rt, B
ID2D1RenderTarget *compatible_rt;
IWICImagingFactory *wic_factory;
ID2D1DeviceContext *context;
+ ID2D1DCRenderTarget *dc_rt;
IWICBitmap *wic_bitmap;
ID2D1Bitmap *bitmap;
+ ID2D1Image *target;
D2D1_SIZE_U size;
HRESULT hr;
@@ -6749,13 +6751,37 @@ static void check_rt_bitmap_surface_(unsigned int line, ID2D1RenderTarget *rt, B
CoUninitialize();
- if (FAILED(ID2D1RenderTarget_QueryInterface(rt, &IID_ID2D1DeviceContext, (void **)&context)))
+ /* Compatible target follows its parent. */
+ hr = ID2D1RenderTarget_QueryInterface(rt, &IID_ID2D1DeviceContext, (void **)&context);
+ ok_(__FILE__, line)(SUCCEEDED(hr), "Failed to get device context, hr %#x.\n", hr);
+
+ dc_rt = NULL;
+ ID2D1RenderTarget_QueryInterface(rt, &IID_ID2D1DCRenderTarget, (void **)&dc_rt);
+
+ bitmap = NULL;
+ target = NULL;
+ ID2D1DeviceContext_GetTarget(context, &target);
+ if (target && FAILED(ID2D1Image_QueryInterface(target, &IID_ID2D1Bitmap, (void **)&bitmap)))
+ {
+ ID2D1Image_Release(target);
+ target = NULL;
+ }
+ if (bitmap)
+ ID2D1Bitmap_Release(bitmap);
+
+ /* Pixel format is not defined until target is set, for DC target it's specified on creation. */
+ if (target || dc_rt)
{
- /* Compatible target follows its parent. */
+ ID2D1DeviceContext *context2;
+
hr = ID2D1RenderTarget_CreateCompatibleRenderTarget(rt, NULL, NULL, NULL,
D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE, (ID2D1BitmapRenderTarget **)&compatible_rt);
ok_(__FILE__, line)(SUCCEEDED(hr), "Failed to create compatible render target, hr %#x.\n", hr);
+ hr = ID2D1RenderTarget_QueryInterface(compatible_rt, &IID_ID2D1DeviceContext, (void **)&context2);
+ ok_(__FILE__, line)(SUCCEEDED(hr), "Failed to get device context, hr %#x.\n", hr);
+ ID2D1DeviceContext_Release(context2);
+
hr = ID2D1RenderTarget_CreateBitmap(compatible_rt, size, bitmap_data, sizeof(*bitmap_data), &bitmap_desc, &bitmap);
ok_(__FILE__, line)(SUCCEEDED(hr), "Failed to create bitmap, hr %#x.\n", hr);
@@ -6765,7 +6791,18 @@ static void check_rt_bitmap_surface_(unsigned int line, ID2D1RenderTarget *rt, B
ID2D1Bitmap_Release(bitmap);
}
else
- ID2D1DeviceContext_Release(context);
+ {
+ hr = ID2D1RenderTarget_CreateCompatibleRenderTarget(rt, NULL, NULL, NULL,
+ D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_NONE, (ID2D1BitmapRenderTarget **)&compatible_rt);
+ todo_wine
+ ok_(__FILE__, line)(hr == WINCODEC_ERR_UNSUPPORTEDPIXELFORMAT, " --- Unexpected hr %#x.\n", hr);
+ }
+
+ ID2D1DeviceContext_Release(context);
+ if (target)
+ ID2D1Image_Release(target);
+ if (dc_rt)
+ ID2D1DCRenderTarget_Release(dc_rt);
}
static void test_bitmap_surface(void)
@@ -6782,6 +6819,7 @@ static void test_bitmap_surface(void)
IDXGISurface *surface;
ID2D1Bitmap1 *bitmap;
ID2D1Device *device;
+ ID2D1Image *target;
HWND window;
HRESULT hr;
@@ -6809,7 +6847,23 @@ static void test_bitmap_surface(void)
rt = create_render_target(surface);
ok(!!rt, "Failed to create render target.\n");
+ hr = ID2D1RenderTarget_QueryInterface(rt, &IID_ID2D1DeviceContext, (void **)&device_context);
+ ok(SUCCEEDED(hr), "Failed to get device context, hr %#x.\n", hr);
+
+ bitmap = NULL;
+ ID2D1DeviceContext_GetTarget(device_context, (ID2D1Image **)&bitmap);
+todo_wine
+ ok(!!bitmap, "Unexpected target.\n");
+
+if (bitmap)
+{
+ check_bitmap_surface((ID2D1Bitmap *)bitmap, TRUE, D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW);
+ ID2D1Bitmap1_Release(bitmap);
+}
check_rt_bitmap_surface(rt, TRUE, D2D1_BITMAP_OPTIONS_NONE);
+
+ ID2D1DeviceContext_Release(device_context);
+
ID2D1RenderTarget_Release(rt);
/* Bitmap created from DXGI surface. */
@@ -6836,7 +6890,14 @@ if (SUCCEEDED(hr))
check_bitmap_surface((ID2D1Bitmap *)bitmap, TRUE, D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW);
check_rt_bitmap_surface((ID2D1RenderTarget *)device_context, TRUE, D2D1_BITMAP_OPTIONS_NONE);
+ ID2D1DeviceContext_SetTarget(device_context, (ID2D1Image *)bitmap);
+ ID2D1DeviceContext_GetTarget(device_context, &target);
+ ok(target == (ID2D1Image *)bitmap, "Unexpected target.\n");
+
+ check_rt_bitmap_surface((ID2D1RenderTarget *)device_context, TRUE, D2D1_BITMAP_OPTIONS_NONE);
+
ID2D1DeviceContext_Release(device_context);
+ ID2D1Bitmap1_Release(bitmap);
}
ID2D1Device_Release(device);
IDXGIDevice_Release(dxgi_device);
--
2.19.0
2
5
24 Sep '18
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/d3d11/d3d11_main.c | 18 +-----------------
dlls/d3d11/d3d11_private.h | 2 --
dlls/d3d11/device.c | 2 ++
dlls/dxgi/device.c | 12 ------------
dlls/dxgi/dxgi_private.h | 2 --
dlls/dxgi/utils.c | 3 ---
6 files changed, 3 insertions(+), 36 deletions(-)
diff --git a/dlls/d3d11/d3d11_main.c b/dlls/d3d11/d3d11_main.c
index 6d981160f245..9c89820f6f53 100644
--- a/dlls/d3d11/d3d11_main.c
+++ b/dlls/d3d11/d3d11_main.c
@@ -95,27 +95,11 @@ static HRESULT WINAPI layer_create(enum dxgi_device_layer_id id, void **layer_ba
return S_OK;
}
-static void WINAPI layer_set_feature_level(enum dxgi_device_layer_id id, void *device,
- D3D_FEATURE_LEVEL feature_level)
-{
- struct d3d_device *d3d_device = device;
-
- TRACE("id %#x, device %p, feature_level %#x.\n", id, device, feature_level);
-
- if (id != DXGI_DEVICE_LAYER_D3D10_DEVICE)
- {
- WARN("Unknown layer id %#x.\n", id);
- return;
- }
-
- d3d_device->feature_level = feature_level;
-}
-
HRESULT WINAPI D3D11CoreRegisterLayers(void)
{
static const struct dxgi_device_layer layers[] =
{
- {DXGI_DEVICE_LAYER_D3D10_DEVICE, layer_init, layer_get_size, layer_create, layer_set_feature_level},
+ {DXGI_DEVICE_LAYER_D3D10_DEVICE, layer_init, layer_get_size, layer_create},
};
DXGID3D10RegisterLayers(layers, ARRAY_SIZE(layers));
diff --git a/dlls/d3d11/d3d11_private.h b/dlls/d3d11/d3d11_private.h
index 6ec413139cf6..3049193ce284 100644
--- a/dlls/d3d11/d3d11_private.h
+++ b/dlls/d3d11/d3d11_private.h
@@ -588,8 +588,6 @@ struct dxgi_device_layer
UINT (WINAPI *get_size)(enum dxgi_device_layer_id id, struct layer_get_size_args *args, DWORD unknown0);
HRESULT (WINAPI *create)(enum dxgi_device_layer_id id, void **layer_base, DWORD unknown0,
void *device_object, REFIID riid, void **device_layer);
- void (WINAPI *set_feature_level)(enum dxgi_device_layer_id id, void *device,
- D3D_FEATURE_LEVEL feature_level);
};
HRESULT WINAPI DXGID3D10CreateDevice(HMODULE d3d10core, IDXGIFactory *factory, IDXGIAdapter *adapter,
diff --git a/dlls/d3d11/device.c b/dlls/d3d11/device.c
index e6ba31c7c4b7..1edd41f0d404 100644
--- a/dlls/d3d11/device.c
+++ b/dlls/d3d11/device.c
@@ -6004,6 +6004,8 @@ static void CDECL device_parent_wined3d_device_created(struct wined3d_device_par
wined3d_device_incref(wined3d_device);
device->wined3d_device = wined3d_device;
+ device->feature_level = wined3d_device_get_feature_level(wined3d_device);
+
set_default_depth_stencil_state(wined3d_device);
}
diff --git a/dlls/dxgi/device.c b/dlls/dxgi/device.c
index deb07ca0d821..51773e9c0054 100644
--- a/dlls/dxgi/device.c
+++ b/dlls/dxgi/device.c
@@ -411,7 +411,6 @@ HRESULT dxgi_device_init(struct dxgi_device *device, struct dxgi_device_layer *l
IWineDXGIDeviceParent *dxgi_device_parent;
struct dxgi_adapter *dxgi_adapter;
struct dxgi_factory *dxgi_factory;
- D3D_FEATURE_LEVEL feature_level;
void *layer_base;
HRESULT hr;
@@ -455,15 +454,6 @@ HRESULT dxgi_device_init(struct dxgi_device *device, struct dxgi_device_layer *l
wined3d_device_parent = IWineDXGIDeviceParent_get_wined3d_device_parent(dxgi_device_parent);
IWineDXGIDeviceParent_Release(dxgi_device_parent);
- if (!(feature_level = dxgi_check_feature_level_support(dxgi_factory, dxgi_adapter,
- feature_levels, level_count)))
- {
- IUnknown_Release(device->child_layer);
- wined3d_private_store_cleanup(&device->private_store);
- wined3d_mutex_unlock();
- return E_FAIL;
- }
-
if (FAILED(hr = wined3d_device_create(dxgi_factory->wined3d,
dxgi_adapter->ordinal, WINED3D_DEVICE_TYPE_HAL, NULL, 0, 4,
(const enum wined3d_feature_level *)feature_levels, level_count,
@@ -476,8 +466,6 @@ HRESULT dxgi_device_init(struct dxgi_device *device, struct dxgi_device_layer *l
return hr;
}
- layer->set_feature_level(layer->id, device->child_layer, feature_level);
-
memset(&swapchain_desc, 0, sizeof(swapchain_desc));
swapchain_desc.swap_effect = WINED3D_SWAP_EFFECT_DISCARD;
swapchain_desc.device_window = dxgi_factory_get_device_window(dxgi_factory);
diff --git a/dlls/dxgi/dxgi_private.h b/dlls/dxgi/dxgi_private.h
index 3a59196e1abd..8c3e41a390bb 100644
--- a/dlls/dxgi/dxgi_private.h
+++ b/dlls/dxgi/dxgi_private.h
@@ -75,8 +75,6 @@ struct dxgi_device_layer
UINT (WINAPI *get_size)(enum dxgi_device_layer_id id, struct layer_get_size_args *args, DWORD unknown0);
HRESULT (WINAPI *create)(enum dxgi_device_layer_id id, void **layer_base, DWORD unknown0,
void *device_object, REFIID riid, void **device_layer);
- void (WINAPI *set_feature_level)(enum dxgi_device_layer_id id, void *device,
- D3D_FEATURE_LEVEL feature_level);
};
/* TRACE helper functions */
diff --git a/dlls/dxgi/utils.c b/dlls/dxgi/utils.c
index 009d351f633f..ad8e2a23f2ae 100644
--- a/dlls/dxgi/utils.c
+++ b/dlls/dxgi/utils.c
@@ -23,7 +23,6 @@
#include "dxgi_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(dxgi);
-WINE_DECLARE_DEBUG_CHANNEL(winediag);
#define WINE_DXGI_TO_STR(x) case x: return #x
@@ -674,7 +673,5 @@ D3D_FEATURE_LEVEL dxgi_check_feature_level_support(struct dxgi_factory *factory,
debug_feature_level(feature_levels[i]));
}
- FIXME_(winediag)("None of the requested D3D feature levels is supported on this GPU "
- "with the current shader backend.\n");
return 0;
}
--
2.16.4
2
1
24 Sep '18
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/wined3d/device.c | 7 +++++++
dlls/wined3d/wined3d.spec | 1 +
include/wine/wined3d.h | 1 +
3 files changed, 9 insertions(+)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 38c37d4c536d..922de369c85a 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -5026,6 +5026,13 @@ struct wined3d * CDECL wined3d_device_get_wined3d(const struct wined3d_device *d
return device->wined3d;
}
+enum wined3d_feature_level CDECL wined3d_device_get_feature_level(const struct wined3d_device *device)
+{
+ TRACE("device %p.\n", device);
+
+ return device->feature_level;
+}
+
void CDECL wined3d_device_set_gamma_ramp(const struct wined3d_device *device,
UINT swapchain_idx, DWORD flags, const struct wined3d_gamma_ramp *ramp)
{
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index a401e04dcf3b..7944387bcab9 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -72,6 +72,7 @@
@ cdecl wined3d_device_get_domain_shader(ptr)
@ cdecl wined3d_device_get_ds_resource_view(ptr long)
@ cdecl wined3d_device_get_ds_sampler(ptr long)
+@ cdecl wined3d_device_get_feature_level(ptr)
@ cdecl wined3d_device_get_gamma_ramp(ptr long ptr)
@ cdecl wined3d_device_get_geometry_shader(ptr)
@ cdecl wined3d_device_get_gs_resource_view(ptr long)
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 6b81b3ab1df1..ef89caf0633f 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2295,6 +2295,7 @@ struct wined3d_shader * __cdecl wined3d_device_get_domain_shader(const struct wi
struct wined3d_shader_resource_view * __cdecl wined3d_device_get_ds_resource_view(const struct wined3d_device *device,
unsigned int idx);
struct wined3d_sampler * __cdecl wined3d_device_get_ds_sampler(const struct wined3d_device *device, unsigned int idx);
+enum wined3d_feature_level __cdecl wined3d_device_get_feature_level(const struct wined3d_device *device);
void __cdecl wined3d_device_get_gamma_ramp(const struct wined3d_device *device,
UINT swapchain_idx, struct wined3d_gamma_ramp *ramp);
struct wined3d_shader * __cdecl wined3d_device_get_geometry_shader(const struct wined3d_device *device);
--
2.16.4
2
1
24 Sep '18
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/d3d8/device.c | 14 +++++++++++---
dlls/d3d9/device.c | 14 +++++++++++++-
dlls/ddraw/ddraw.c | 10 +++++++++-
dlls/dxgi/device.c | 7 ++++---
dlls/dxgi/dxgi_private.h | 1 +
dlls/wined3d/device.c | 31 +++++++++++++++++++++++++++++--
dlls/wined3d/directx.c | 20 +++++++++++---------
dlls/wined3d/utils.c | 22 ++++++++++++++++++++++
dlls/wined3d/wined3d.spec | 2 +-
dlls/wined3d/wined3d_private.h | 6 +++++-
include/wine/wined3d.h | 3 ++-
11 files changed, 108 insertions(+), 22 deletions(-)
diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c
index 364798f79b3a..12d025383514 100644
--- a/dlls/d3d8/device.c
+++ b/dlls/d3d8/device.c
@@ -3399,6 +3399,14 @@ HRESULT device_init(struct d3d8_device *device, struct d3d8 *parent, struct wine
struct wined3d_swapchain *wined3d_swapchain;
HRESULT hr;
+ static const enum wined3d_feature_level feature_levels[] =
+ {
+ WINED3D_FEATURE_LEVEL_8,
+ WINED3D_FEATURE_LEVEL_7,
+ WINED3D_FEATURE_LEVEL_6,
+ WINED3D_FEATURE_LEVEL_5,
+ };
+
device->IDirect3DDevice8_iface.lpVtbl = &d3d8_device_vtbl;
device->device_parent.ops = &d3d8_wined3d_device_parent_ops;
device->ref = 1;
@@ -3413,9 +3421,9 @@ HRESULT device_init(struct d3d8_device *device, struct d3d8 *parent, struct wine
if (!(flags & D3DCREATE_FPU_PRESERVE)) setup_fpu();
wined3d_mutex_lock();
- hr = wined3d_device_create(wined3d, adapter, device_type, focus_window, flags, 4,
- &device->device_parent, &device->wined3d_device);
- if (FAILED(hr))
+ if (FAILED(hr = wined3d_device_create(wined3d, adapter, device_type,
+ focus_window, flags, 4, feature_levels, ARRAY_SIZE(feature_levels),
+ &device->device_parent, &device->wined3d_device)))
{
WARN("Failed to create wined3d device, hr %#x.\n", hr);
wined3d_mutex_unlock();
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
index a8dc7097c487..a31360886b6a 100644
--- a/dlls/d3d9/device.c
+++ b/dlls/d3d9/device.c
@@ -4230,6 +4230,17 @@ HRESULT device_init(struct d3d9_device *device, struct d3d9 *parent, struct wine
unsigned i, count = 1;
HRESULT hr;
+ static const enum wined3d_feature_level feature_levels[] =
+ {
+ WINED3D_FEATURE_LEVEL_9_SM3,
+ WINED3D_FEATURE_LEVEL_9_SM2,
+ WINED3D_FEATURE_LEVEL_9_1,
+ WINED3D_FEATURE_LEVEL_8,
+ WINED3D_FEATURE_LEVEL_7,
+ WINED3D_FEATURE_LEVEL_6,
+ WINED3D_FEATURE_LEVEL_5,
+ };
+
if (mode)
FIXME("Ignoring display mode.\n");
@@ -4240,7 +4251,8 @@ HRESULT device_init(struct d3d9_device *device, struct d3d9 *parent, struct wine
if (!(flags & D3DCREATE_FPU_PRESERVE)) setup_fpu();
wined3d_mutex_lock();
- if (FAILED(hr = wined3d_device_create(wined3d, adapter, device_type, focus_window, flags, 4,
+ if (FAILED(hr = wined3d_device_create(wined3d, adapter, device_type,
+ focus_window, flags, 4, feature_levels, ARRAY_SIZE(feature_levels),
&device->device_parent, &device->wined3d_device)))
{
WARN("Failed to create wined3d device, hr %#x.\n", hr);
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index c83d0ca15689..56a74cb3285f 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -4986,6 +4986,13 @@ HRESULT ddraw_init(struct ddraw *ddraw, DWORD flags, enum wined3d_device_type de
struct wined3d_caps caps;
HRESULT hr;
+ static const enum wined3d_feature_level feature_levels[] =
+ {
+ WINED3D_FEATURE_LEVEL_7,
+ WINED3D_FEATURE_LEVEL_6,
+ WINED3D_FEATURE_LEVEL_5,
+ };
+
ddraw->IDirectDraw7_iface.lpVtbl = &ddraw7_vtbl;
ddraw->IDirectDraw_iface.lpVtbl = &ddraw1_vtbl;
ddraw->IDirectDraw2_iface.lpVtbl = &ddraw2_vtbl;
@@ -5023,7 +5030,8 @@ HRESULT ddraw_init(struct ddraw *ddraw, DWORD flags, enum wined3d_device_type de
}
if (FAILED(hr = wined3d_device_create(ddraw->wined3d, WINED3DADAPTER_DEFAULT, device_type,
- NULL, 0, DDRAW_STRIDE_ALIGNMENT, &ddraw->device_parent, &ddraw->wined3d_device)))
+ NULL, 0, DDRAW_STRIDE_ALIGNMENT, feature_levels, ARRAY_SIZE(feature_levels),
+ &ddraw->device_parent, &ddraw->wined3d_device)))
{
WARN("Failed to create a wined3d device, hr %#x.\n", hr);
wined3d_decref(ddraw->wined3d);
diff --git a/dlls/dxgi/device.c b/dlls/dxgi/device.c
index 67cadd5a3f89..deb07ca0d821 100644
--- a/dlls/dxgi/device.c
+++ b/dlls/dxgi/device.c
@@ -464,9 +464,10 @@ HRESULT dxgi_device_init(struct dxgi_device *device, struct dxgi_device_layer *l
return E_FAIL;
}
- hr = wined3d_device_create(dxgi_factory->wined3d, dxgi_adapter->ordinal, WINED3D_DEVICE_TYPE_HAL,
- NULL, 0, 4, wined3d_device_parent, &device->wined3d_device);
- if (FAILED(hr))
+ if (FAILED(hr = wined3d_device_create(dxgi_factory->wined3d,
+ dxgi_adapter->ordinal, WINED3D_DEVICE_TYPE_HAL, NULL, 0, 4,
+ (const enum wined3d_feature_level *)feature_levels, level_count,
+ wined3d_device_parent, &device->wined3d_device)))
{
WARN("Failed to create a wined3d device, returning %#x.\n", hr);
IUnknown_Release(device->child_layer);
diff --git a/dlls/dxgi/dxgi_private.h b/dlls/dxgi/dxgi_private.h
index f74514f0d326..3a59196e1abd 100644
--- a/dlls/dxgi/dxgi_private.h
+++ b/dlls/dxgi/dxgi_private.h
@@ -97,6 +97,7 @@ DXGI_USAGE dxgi_usage_from_wined3d_usage(DWORD wined3d_usage) DECLSPEC_HIDDEN;
DWORD wined3d_usage_from_dxgi_usage(DXGI_USAGE usage) DECLSPEC_HIDDEN;
unsigned int dxgi_swapchain_flags_from_wined3d(unsigned int wined3d_flags) DECLSPEC_HIDDEN;
unsigned int wined3d_swapchain_flags_from_dxgi(unsigned int flags) DECLSPEC_HIDDEN;
+
HRESULT dxgi_get_private_data(struct wined3d_private_store *store,
REFGUID guid, UINT *data_size, void *data) DECLSPEC_HIDDEN;
HRESULT dxgi_set_private_data(struct wined3d_private_store *store,
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 3fc3ae557dc6..38c37d4c536d 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -5158,16 +5158,43 @@ static int wined3d_sampler_compare(const void *key, const struct wine_rb_entry *
return memcmp(&sampler->desc, key, sizeof(sampler->desc));
}
+static BOOL wined3d_select_feature_level(const struct wined3d_adapter *adapter,
+ const enum wined3d_feature_level *levels, unsigned int level_count,
+ enum wined3d_feature_level *selected_level)
+{
+ const struct wined3d_d3d_info *d3d_info = &adapter->d3d_info;
+ unsigned int i;
+
+ for (i = 0; i < level_count; ++i)
+ {
+ if (levels[i] && d3d_info->feature_level >= levels[i])
+ {
+ *selected_level = levels[i];
+ return TRUE;
+ }
+ }
+
+ FIXME_(winediag)("None of the requested D3D feature levels is supported on this GPU "
+ "with the current shader backend.\n");
+ return FALSE;
+}
+
HRESULT device_init(struct wined3d_device *device, struct wined3d *wined3d,
UINT adapter_idx, enum wined3d_device_type device_type, HWND focus_window, DWORD flags,
- BYTE surface_alignment, struct wined3d_device_parent *device_parent)
+ BYTE surface_alignment, const enum wined3d_feature_level *levels, unsigned int level_count,
+ struct wined3d_device_parent *device_parent)
{
struct wined3d_adapter *adapter = &wined3d->adapters[adapter_idx];
- const struct fragment_pipeline *fragment_pipeline;
const struct wined3d_vertex_pipe_ops *vertex_pipeline;
+ const struct fragment_pipeline *fragment_pipeline;
unsigned int i;
HRESULT hr;
+ if (!wined3d_select_feature_level(adapter, levels, level_count, &device->feature_level))
+ return E_FAIL;
+
+ TRACE("Device feature level %s.\n", wined3d_debug_feature_level(device->feature_level));
+
device->ref = 1;
device->wined3d = wined3d;
wined3d_incref(device->wined3d);
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 4e8afed0a938..b893e0541946 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -2448,16 +2448,18 @@ HRESULT CDECL wined3d_get_device_caps(const struct wined3d *wined3d, UINT adapte
return WINED3D_OK;
}
-HRESULT CDECL wined3d_device_create(struct wined3d *wined3d, UINT adapter_idx, enum wined3d_device_type device_type,
- HWND focus_window, DWORD flags, BYTE surface_alignment, struct wined3d_device_parent *device_parent,
- struct wined3d_device **device)
+HRESULT CDECL wined3d_device_create(struct wined3d *wined3d, unsigned int adapter_idx,
+ enum wined3d_device_type device_type, HWND focus_window, DWORD flags, BYTE surface_alignment,
+ const enum wined3d_feature_level *feature_levels, unsigned int feature_level_count,
+ struct wined3d_device_parent *device_parent, struct wined3d_device **device)
{
struct wined3d_device *object;
HRESULT hr;
- TRACE("wined3d %p, adapter_idx %u, device_type %#x, focus_window %p, "
- "flags %#x, surface_alignment %u, device_parent %p, device %p.\n",
- wined3d, adapter_idx, device_type, focus_window, flags, surface_alignment, device_parent, device);
+ TRACE("wined3d %p, adapter_idx %u, device_type %#x, focus_window %p, flags %#x, "
+ "surface_alignment %u, feature_levels %p, feature_level_count %u, device_parent %p, device %p.\n",
+ wined3d, adapter_idx, device_type, focus_window, flags, surface_alignment,
+ feature_levels, feature_level_count, device_parent, device);
if (adapter_idx >= wined3d->adapter_count)
return WINED3DERR_INVALIDCALL;
@@ -2465,9 +2467,9 @@ HRESULT CDECL wined3d_device_create(struct wined3d *wined3d, UINT adapter_idx, e
if (!(object = heap_alloc_zero(sizeof(*object))))
return E_OUTOFMEMORY;
- hr = device_init(object, wined3d, adapter_idx, device_type,
- focus_window, flags, surface_alignment, device_parent);
- if (FAILED(hr))
+ if (FAILED(hr = device_init(object, wined3d, adapter_idx,
+ device_type, focus_window, flags, surface_alignment,
+ feature_levels, feature_level_count, device_parent)))
{
WARN("Failed to initialize device, hr %#x.\n", hr);
heap_free(object);
diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c
index bf32953032ea..23f5fd70c675 100644
--- a/dlls/wined3d/utils.c
+++ b/dlls/wined3d/utils.c
@@ -6243,6 +6243,28 @@ const char *wined3d_debug_location(DWORD location)
return wine_dbg_sprintf("%s%s%s", prefix, buffer.str, suffix);
}
+const char *wined3d_debug_feature_level(enum wined3d_feature_level level)
+{
+ switch (level)
+ {
+#define LEVEL_TO_STR(level) case level: return #level
+ LEVEL_TO_STR(WINED3D_FEATURE_LEVEL_5);
+ LEVEL_TO_STR(WINED3D_FEATURE_LEVEL_6);
+ LEVEL_TO_STR(WINED3D_FEATURE_LEVEL_7);
+ LEVEL_TO_STR(WINED3D_FEATURE_LEVEL_8);
+ LEVEL_TO_STR(WINED3D_FEATURE_LEVEL_9_1);
+ LEVEL_TO_STR(WINED3D_FEATURE_LEVEL_9_SM2);
+ LEVEL_TO_STR(WINED3D_FEATURE_LEVEL_9_SM3);
+ LEVEL_TO_STR(WINED3D_FEATURE_LEVEL_10);
+ LEVEL_TO_STR(WINED3D_FEATURE_LEVEL_10_1);
+ LEVEL_TO_STR(WINED3D_FEATURE_LEVEL_11);
+ LEVEL_TO_STR(WINED3D_FEATURE_LEVEL_11_1);
+#undef LEVEL_TO_STR
+ default:
+ return wine_dbg_sprintf("%#x", level);
+ }
+}
+
/* Print a floating point value with the %.8e format specifier, always using
* '.' as decimal separator. */
void wined3d_ftoa(float value, char *s)
diff --git a/dlls/wined3d/wined3d.spec b/dlls/wined3d/wined3d.spec
index 93cecf0d3bb4..a401e04dcf3b 100644
--- a/dlls/wined3d/wined3d.spec
+++ b/dlls/wined3d/wined3d.spec
@@ -42,7 +42,7 @@
@ cdecl wined3d_device_copy_resource(ptr ptr ptr)
@ cdecl wined3d_device_copy_sub_resource_region(ptr ptr long long long long ptr long ptr long)
@ cdecl wined3d_device_copy_uav_counter(ptr ptr long ptr)
-@ cdecl wined3d_device_create(ptr long long ptr long long ptr ptr)
+@ cdecl wined3d_device_create(ptr long long ptr long long ptr long ptr ptr)
@ cdecl wined3d_device_decref(ptr)
@ cdecl wined3d_device_dispatch_compute(ptr long long long)
@ cdecl wined3d_device_dispatch_compute_indirect(ptr ptr long)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 637c7218c184..423dda83e731 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -2981,6 +2981,8 @@ struct wined3d_device
WORD padding2 : 16;
+ enum wined3d_feature_level feature_level;
+
struct wined3d_state state;
struct wined3d_state *update_state;
struct wined3d_stateblock *recording;
@@ -3036,7 +3038,8 @@ BOOL device_context_add(struct wined3d_device *device, struct wined3d_context *c
void device_context_remove(struct wined3d_device *device, struct wined3d_context *context) DECLSPEC_HIDDEN;
HRESULT device_init(struct wined3d_device *device, struct wined3d *wined3d,
UINT adapter_idx, enum wined3d_device_type device_type, HWND focus_window, DWORD flags,
- BYTE surface_alignment, struct wined3d_device_parent *device_parent) DECLSPEC_HIDDEN;
+ BYTE surface_alignment, const enum wined3d_feature_level *levels, unsigned int level_count,
+ struct wined3d_device_parent *device_parent) DECLSPEC_HIDDEN;
LRESULT device_process_message(struct wined3d_device *device, HWND window, BOOL unicode,
UINT message, WPARAM wparam, LPARAM lparam, WNDPROC proc) DECLSPEC_HIDDEN;
void device_resource_add(struct wined3d_device *device, struct wined3d_resource *resource) DECLSPEC_HIDDEN;
@@ -3913,6 +3916,7 @@ const char *debug_ivec4(const struct wined3d_ivec4 *v) DECLSPEC_HIDDEN;
const char *debug_uvec4(const struct wined3d_uvec4 *v) DECLSPEC_HIDDEN;
const char *debug_shader_type(enum wined3d_shader_type shader_type) DECLSPEC_HIDDEN;
const char *debug_vec4(const struct wined3d_vec4 *v) DECLSPEC_HIDDEN;
+const char *wined3d_debug_feature_level(enum wined3d_feature_level level) DECLSPEC_HIDDEN;
void dump_color_fixup_desc(struct color_fixup_desc fixup) DECLSPEC_HIDDEN;
BOOL is_invalid_op(const struct wined3d_state *state, int stage,
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 17b0fd4c456d..6b81b3ab1df1 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -2248,8 +2248,9 @@ HRESULT __cdecl wined3d_device_copy_sub_resource_region(struct wined3d_device *d
unsigned int src_sub_resource_idx, const struct wined3d_box *src_box, unsigned int flags);
void __cdecl wined3d_device_copy_uav_counter(struct wined3d_device *device,
struct wined3d_buffer *dst_buffer, unsigned int offset, struct wined3d_unordered_access_view *uav);
-HRESULT __cdecl wined3d_device_create(struct wined3d *wined3d, UINT adapter_idx,
+HRESULT __cdecl wined3d_device_create(struct wined3d *wined3d, unsigned int adapter_idx,
enum wined3d_device_type device_type, HWND focus_window, DWORD behaviour_flags, BYTE surface_alignment,
+ const enum wined3d_feature_level *feature_levels, unsigned int feature_level_count,
struct wined3d_device_parent *device_parent, struct wined3d_device **device);
ULONG __cdecl wined3d_device_decref(struct wined3d_device *device);
void __cdecl wined3d_device_dispatch_compute(struct wined3d_device *device,
--
2.16.4
2
1
We still don't have proper and exhaustive checks for feature levels
capabilities.
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/dxgi/utils.c | 6 +++---
dlls/wined3d/adapter_gl.c | 6 +++++-
include/wine/wined3d.h | 3 +++
3 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/dlls/dxgi/utils.c b/dlls/dxgi/utils.c
index e857a1f090f5..009d351f633f 100644
--- a/dlls/dxgi/utils.c
+++ b/dlls/dxgi/utils.c
@@ -626,11 +626,11 @@ static enum wined3d_feature_level wined3d_feature_level_from_d3d(D3D_FEATURE_LEV
switch (feature_level)
{
case D3D_FEATURE_LEVEL_11_1:
- return WINED3D_FEATURE_LEVEL_11;
+ return WINED3D_FEATURE_LEVEL_11_1;
case D3D_FEATURE_LEVEL_11_0:
return WINED3D_FEATURE_LEVEL_11;
case D3D_FEATURE_LEVEL_10_1:
- return WINED3D_FEATURE_LEVEL_10;
+ return WINED3D_FEATURE_LEVEL_10_1;
case D3D_FEATURE_LEVEL_10_0:
return WINED3D_FEATURE_LEVEL_10;
case D3D_FEATURE_LEVEL_9_3:
@@ -638,7 +638,7 @@ static enum wined3d_feature_level wined3d_feature_level_from_d3d(D3D_FEATURE_LEV
case D3D_FEATURE_LEVEL_9_2:
return WINED3D_FEATURE_LEVEL_9_SM2;
case D3D_FEATURE_LEVEL_9_1:
- return WINED3D_FEATURE_LEVEL_9_SM2;
+ return WINED3D_FEATURE_LEVEL_9_1;
default:
FIXME("Unhandled feature level %#x.\n", feature_level);
return 0;
diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c
index 0ee71fd63df5..1d360d104bf8 100644
--- a/dlls/wined3d/adapter_gl.c
+++ b/dlls/wined3d/adapter_gl.c
@@ -1256,10 +1256,14 @@ static enum wined3d_feature_level feature_level_from_caps(const struct wined3d_g
if (shader_model >= 5
&& gl_info->supported[ARB_DRAW_INDIRECT]
&& gl_info->supported[ARB_TEXTURE_COMPRESSION_BPTC])
- return WINED3D_FEATURE_LEVEL_11;
+ return WINED3D_FEATURE_LEVEL_11_1;
if (shader_model >= 4)
+ {
+ if (gl_info->supported[ARB_TEXTURE_CUBE_MAP_ARRAY])
+ return WINED3D_FEATURE_LEVEL_10_1;
return WINED3D_FEATURE_LEVEL_10;
+ }
}
if (shader_model >= 3)
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index 3c01f755d869..17b0fd4c456d 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -95,10 +95,13 @@ enum wined3d_feature_level
WINED3D_FEATURE_LEVEL_6 = 0x6000,
WINED3D_FEATURE_LEVEL_7 = 0x7000,
WINED3D_FEATURE_LEVEL_8 = 0x8000,
+ WINED3D_FEATURE_LEVEL_9_1 = 0x9100,
WINED3D_FEATURE_LEVEL_9_SM2 = 0x9200,
WINED3D_FEATURE_LEVEL_9_SM3 = 0x9300,
WINED3D_FEATURE_LEVEL_10 = 0xa000,
+ WINED3D_FEATURE_LEVEL_10_1 = 0xa100,
WINED3D_FEATURE_LEVEL_11 = 0xb000,
+ WINED3D_FEATURE_LEVEL_11_1 = 0xb100,
};
enum wined3d_degree_type
--
2.16.4
2
1
[PATCH 2/6] wined3d: Make feature level enum compatible with Direct3D enum.
by Józef Kucia 24 Sep '18
by Józef Kucia 24 Sep '18
24 Sep '18
Signed-off-by: Józef Kucia <jkucia(a)codeweavers.com>
---
dlls/wined3d/directx.c | 89 ++++++++++++++++++++++++++++++--------------------
include/wine/wined3d.h | 18 +++++-----
2 files changed, 62 insertions(+), 45 deletions(-)
diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index 89684477e685..4e8afed0a938 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -617,49 +617,52 @@ void wined3d_driver_info_init(struct wined3d_driver_info *driver_info,
enum wined3d_pci_device wined3d_gpu_from_feature_level(enum wined3d_pci_vendor *vendor,
enum wined3d_feature_level feature_level)
{
- unsigned int i;
-
- static const enum wined3d_pci_device card_fallback_nvidia[] =
- {
- CARD_NVIDIA_RIVA_128, /* D3D5 */
- CARD_NVIDIA_RIVA_TNT, /* D3D6 */
- CARD_NVIDIA_GEFORCE, /* D3D7 */
- CARD_NVIDIA_GEFORCE3, /* D3D8 */
- CARD_NVIDIA_GEFORCEFX_5800, /* D3D9_SM2 */
- CARD_NVIDIA_GEFORCE_6800, /* D3D9_SM3 */
- CARD_NVIDIA_GEFORCE_8800GTX, /* D3D10 */
- CARD_NVIDIA_GEFORCE_GTX470, /* D3D11 */
+ static const struct wined3d_fallback_card
+ {
+ enum wined3d_feature_level feature_level;
+ enum wined3d_pci_device device_id;
+ }
+ card_fallback_nvidia[] =
+ {
+ {WINED3D_FEATURE_LEVEL_5, CARD_NVIDIA_RIVA_128},
+ {WINED3D_FEATURE_LEVEL_6, CARD_NVIDIA_RIVA_TNT},
+ {WINED3D_FEATURE_LEVEL_7, CARD_NVIDIA_GEFORCE},
+ {WINED3D_FEATURE_LEVEL_8, CARD_NVIDIA_GEFORCE3},
+ {WINED3D_FEATURE_LEVEL_9_SM2, CARD_NVIDIA_GEFORCEFX_5800},
+ {WINED3D_FEATURE_LEVEL_9_SM3, CARD_NVIDIA_GEFORCE_6800},
+ {WINED3D_FEATURE_LEVEL_10, CARD_NVIDIA_GEFORCE_8800GTX},
+ {WINED3D_FEATURE_LEVEL_11, CARD_NVIDIA_GEFORCE_GTX470},
+ {WINED3D_FEATURE_LEVEL_NONE},
},
card_fallback_amd[] =
{
- CARD_AMD_RAGE_128PRO, /* D3D5 */
- CARD_AMD_RAGE_128PRO, /* D3D6 */
- CARD_AMD_RADEON_7200, /* D3D7 */
- CARD_AMD_RADEON_8500, /* D3D8 */
- CARD_AMD_RADEON_9500, /* D3D9_SM2 */
- CARD_AMD_RADEON_X1600, /* D3D9_SM3 */
- CARD_AMD_RADEON_HD2900, /* D3D10 */
- CARD_AMD_RADEON_HD5600, /* D3D11 */
+ {WINED3D_FEATURE_LEVEL_5, CARD_AMD_RAGE_128PRO},
+ {WINED3D_FEATURE_LEVEL_6, CARD_AMD_RAGE_128PRO},
+ {WINED3D_FEATURE_LEVEL_7, CARD_AMD_RADEON_7200},
+ {WINED3D_FEATURE_LEVEL_8, CARD_AMD_RADEON_8500},
+ {WINED3D_FEATURE_LEVEL_9_SM2, CARD_AMD_RADEON_9500},
+ {WINED3D_FEATURE_LEVEL_9_SM3, CARD_AMD_RADEON_X1600},
+ {WINED3D_FEATURE_LEVEL_10, CARD_AMD_RADEON_HD2900},
+ {WINED3D_FEATURE_LEVEL_11, CARD_AMD_RADEON_HD5600},
+ {WINED3D_FEATURE_LEVEL_NONE},
},
card_fallback_intel[] =
{
- CARD_INTEL_845G, /* D3D5 */
- CARD_INTEL_845G, /* D3D6 */
- CARD_INTEL_845G, /* D3D7 */
- CARD_INTEL_915G, /* D3D8 */
- CARD_INTEL_915G, /* D3D9_SM2 */
- CARD_INTEL_945G, /* D3D9_SM3 */
- CARD_INTEL_G45, /* D3D10 */
- CARD_INTEL_IVBD, /* D3D11 */
+ {WINED3D_FEATURE_LEVEL_5, CARD_INTEL_845G},
+ {WINED3D_FEATURE_LEVEL_6, CARD_INTEL_845G},
+ {WINED3D_FEATURE_LEVEL_7, CARD_INTEL_845G},
+ {WINED3D_FEATURE_LEVEL_8, CARD_INTEL_915G},
+ {WINED3D_FEATURE_LEVEL_9_SM2, CARD_INTEL_915G},
+ {WINED3D_FEATURE_LEVEL_9_SM3, CARD_INTEL_945G},
+ {WINED3D_FEATURE_LEVEL_10, CARD_INTEL_G45},
+ {WINED3D_FEATURE_LEVEL_11, CARD_INTEL_IVBD},
+ {WINED3D_FEATURE_LEVEL_NONE},
};
- C_ASSERT(ARRAY_SIZE(card_fallback_nvidia) == WINED3D_FEATURE_LEVEL_COUNT);
- C_ASSERT(ARRAY_SIZE(card_fallback_amd) == WINED3D_FEATURE_LEVEL_COUNT);
- C_ASSERT(ARRAY_SIZE(card_fallback_intel) == WINED3D_FEATURE_LEVEL_COUNT);
static const struct
{
enum wined3d_pci_vendor vendor;
- const enum wined3d_pci_device *device;
+ const struct wined3d_fallback_card *cards;
}
fallbacks[] =
{
@@ -669,15 +672,29 @@ enum wined3d_pci_device wined3d_gpu_from_feature_level(enum wined3d_pci_vendor *
{HW_VENDOR_INTEL, card_fallback_intel},
};
+ const struct wined3d_fallback_card *cards;
+ enum wined3d_pci_device device_id;
+ unsigned int i;
+
+ cards = NULL;
for (i = 0; i < ARRAY_SIZE(fallbacks); ++i)
{
if (*vendor == fallbacks[i].vendor)
- return fallbacks[i].device[feature_level];
+ cards = fallbacks[i].cards;
+ }
+ if (!cards)
+ {
+ *vendor = HW_VENDOR_NVIDIA;
+ cards = card_fallback_nvidia;
}
- *vendor = HW_VENDOR_NVIDIA;
-
- return card_fallback_nvidia[feature_level];
+ device_id = cards->device_id;
+ for (i = 0; cards[i].feature_level; ++i)
+ {
+ if (feature_level >= cards[i].feature_level)
+ device_id = cards[i].device_id;
+ }
+ return device_id;
}
UINT CDECL wined3d_get_adapter_count(const struct wined3d *wined3d)
diff --git a/include/wine/wined3d.h b/include/wine/wined3d.h
index ac7e3dd85cb4..3c01f755d869 100644
--- a/include/wine/wined3d.h
+++ b/include/wine/wined3d.h
@@ -90,15 +90,15 @@ enum wined3d_device_type
enum wined3d_feature_level
{
- WINED3D_FEATURE_LEVEL_5,
- WINED3D_FEATURE_LEVEL_6,
- WINED3D_FEATURE_LEVEL_7,
- WINED3D_FEATURE_LEVEL_8,
- WINED3D_FEATURE_LEVEL_9_SM2,
- WINED3D_FEATURE_LEVEL_9_SM3,
- WINED3D_FEATURE_LEVEL_10,
- WINED3D_FEATURE_LEVEL_11,
- WINED3D_FEATURE_LEVEL_COUNT
+ WINED3D_FEATURE_LEVEL_NONE = 0x0000,
+ WINED3D_FEATURE_LEVEL_5 = 0x5000,
+ WINED3D_FEATURE_LEVEL_6 = 0x6000,
+ WINED3D_FEATURE_LEVEL_7 = 0x7000,
+ WINED3D_FEATURE_LEVEL_8 = 0x8000,
+ WINED3D_FEATURE_LEVEL_9_SM2 = 0x9200,
+ WINED3D_FEATURE_LEVEL_9_SM3 = 0x9300,
+ WINED3D_FEATURE_LEVEL_10 = 0xa000,
+ WINED3D_FEATURE_LEVEL_11 = 0xb000,
};
enum wined3d_degree_type
--
2.16.4
2
1