wine-staging/patches/wined3d-1DTextures/0009-wined3d-Implement-converting-between-s-rgb-1d-textur.patch

63 lines
2.7 KiB
Diff
Raw Normal View History

From ae4b60f9b626f36b7db26a5e93720c46b2a6c14b Mon Sep 17 00:00:00 2001
2016-08-31 08:42:50 -07:00
From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
Date: Sat, 27 Aug 2016 22:44:14 +0200
Subject: [PATCH 09/17] wined3d: Implement converting between (s)rgb 1d
textures.
2016-08-31 08:42:50 -07:00
---
dlls/wined3d/texture.c | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index 198d2a6..6f27fb7 100644
2016-08-31 08:42:50 -07:00
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -1798,6 +1798,29 @@ static void texture1d_download_data(struct wined3d_texture *texture, unsigned in
2016-08-31 08:42:50 -07:00
}
/* Context activation is done by the caller. */
+static void texture1d_srgb_transfer(struct wined3d_texture *texture, unsigned int sub_resource_idx,
+ struct wined3d_context *context, BOOL dest_is_srgb)
+{
+ struct wined3d_texture_sub_resource *sub_resource = &texture->sub_resources[sub_resource_idx];
+ unsigned int row_pitch, slice_pitch;
+ struct wined3d_bo_address data;
+
+ WARN_(d3d_perf)("Performing slow rgb/srgb 1d texture transfer.\n");
+ data.buffer_object = 0;
+ if (!(data.addr = HeapAlloc(GetProcessHeap(), 0, sub_resource->size)))
+ return;
+
+ wined3d_texture_get_pitch(texture, sub_resource_idx, &row_pitch, &slice_pitch);
+ wined3d_texture_bind_and_dirtify(texture, context, !dest_is_srgb);
+ texture1d_download_data(texture, sub_resource_idx, context, &data);
+ wined3d_texture_bind_and_dirtify(texture, context, dest_is_srgb);
+ texture1d_upload_data(texture, sub_resource_idx, context, NULL,
2016-08-31 08:42:50 -07:00
+ wined3d_const_bo_address(&data), row_pitch, slice_pitch);
+
+ HeapFree(GetProcessHeap(), 0, data.addr);
+}
+
+/* Context activation is done by the caller. */
static BOOL texture1d_load_location(struct wined3d_texture *texture, unsigned int sub_resource_idx,
struct wined3d_context *context, DWORD location)
{
@@ -1853,6 +1876,14 @@ static BOOL texture1d_load_location(struct wined3d_texture *texture, unsigned in
2016-08-31 08:42:50 -07:00
wined3d_texture_get_pitch(texture, sub_resource_idx, &row_pitch, &slice_pitch);
texture1d_upload_data(texture, sub_resource_idx, context, NULL, &data, row_pitch, slice_pitch);
2016-08-31 08:42:50 -07:00
}
+ else if (sub_resource->locations & WINED3D_LOCATION_TEXTURE_RGB)
+ {
+ texture1d_srgb_transfer(texture, sub_resource_idx, context, TRUE);
+ }
+ else if (sub_resource->locations & WINED3D_LOCATION_TEXTURE_SRGB)
+ {
+ texture1d_srgb_transfer(texture, sub_resource_idx, context, FALSE);
+ }
else
{
FIXME("Implement 1d texture loading from %s.\n", wined3d_debug_location(sub_resource->locations));
--
1.9.1
2016-08-31 08:42:50 -07:00