[PATCH 7/7] wined3d: Differentiate between single layer and layered render target views.

Józef Kucia jkucia at codeweavers.com
Mon Apr 10 05:27:43 CDT 2017


Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 dlls/wined3d/context.c         | 10 ++++++++--
 dlls/wined3d/device.c          |  2 +-
 dlls/wined3d/view.c            |  6 +++---
 dlls/wined3d/wined3d_private.h |  3 ++-
 4 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/dlls/wined3d/context.c b/dlls/wined3d/context.c
index aaf9ab0..48b9347 100644
--- a/dlls/wined3d/context.c
+++ b/dlls/wined3d/context.c
@@ -139,7 +139,7 @@ static void context_attach_gl_texture_fbo(struct wined3d_context *context,
         gl_info->fbo_ops.glFramebufferTexture(fbo_target, attachment,
                 resource->object, resource->level);
     }
-    else if (resource->target == GL_TEXTURE_2D_ARRAY)
+    else if (resource->target == GL_TEXTURE_2D_ARRAY || resource->target == GL_TEXTURE_3D)
     {
         if (!gl_info->fbo_ops.glFramebufferTextureLayer)
         {
@@ -433,8 +433,10 @@ static inline void context_set_fbo_key_for_render_target(const struct wined3d_co
     {
         key->objects[idx].target = texture->target;
         key->objects[idx].level = sub_resource_idx % texture->level_count;
-        key->objects[idx].layer = WINED3D_ALL_LAYERS;
+        key->objects[idx].layer = sub_resource_idx / texture->level_count;
     }
+    if (render_target->layer_count != 1)
+        key->objects[idx].layer = WINED3D_ALL_LAYERS;
 
     switch (location)
     {
@@ -475,6 +477,7 @@ static void context_generate_fbo_key(const struct wined3d_context *context,
     {
         depth_stencil.resource = &depth_stencil_surface->container->resource;
         depth_stencil.sub_resource_idx = surface_get_sub_resource_idx(depth_stencil_surface);
+        depth_stencil.layer_count = 1;
     }
     context_set_fbo_key_for_render_target(context, key, 0, &depth_stencil, ds_location);
 
@@ -738,6 +741,7 @@ void context_apply_fbo_state_blit(struct wined3d_context *context, GLenum target
     {
         context->blit_targets[0].resource = &render_target->container->resource;
         context->blit_targets[0].sub_resource_idx = surface_get_sub_resource_idx(render_target);
+        context->blit_targets[0].layer_count = 1;
     }
     context_apply_fbo_state(context, target, context->blit_targets, depth_stencil, location, location);
 }
@@ -2745,6 +2749,7 @@ BOOL context_apply_clear_state(struct wined3d_context *context, const struct win
                         context->blit_targets[i].gl_view = rts[i]->gl_view;
                         context->blit_targets[i].resource = rts[i]->resource;
                         context->blit_targets[i].sub_resource_idx = rts[i]->sub_resource_idx;
+                        context->blit_targets[i].layer_count = rts[i]->layer_count;
                     }
                     if (rts[i] && rts[i]->format->id != WINED3DFMT_NULL)
                         rt_mask |= (1u << i);
@@ -2879,6 +2884,7 @@ void context_state_fb(struct wined3d_context *context, const struct wined3d_stat
                     context->blit_targets[i].gl_view = fb->render_targets[i]->gl_view;
                     context->blit_targets[i].resource = fb->render_targets[i]->resource;
                     context->blit_targets[i].sub_resource_idx = fb->render_targets[i]->sub_resource_idx;
+                    context->blit_targets[i].layer_count = fb->render_targets[i]->layer_count;
                 }
             }
             context_apply_fbo_state(context, GL_FRAMEBUFFER, context->blit_targets,
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 3d4fbb8..0ee264d 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -4143,7 +4143,7 @@ HRESULT CDECL wined3d_device_clear_rendertarget_view(struct wined3d_device *devi
         return WINED3DERR_INVALIDCALL;
     }
 
-    if (view->depth > 1)
+    if (view->layer_count > 1)
     {
         FIXME("Layered clears not implemented.\n");
         return WINED3DERR_INVALIDCALL;
diff --git a/dlls/wined3d/view.c b/dlls/wined3d/view.c
index 4e503e8..294ed9a 100644
--- a/dlls/wined3d/view.c
+++ b/dlls/wined3d/view.c
@@ -419,7 +419,7 @@ static void wined3d_render_target_view_cs_init(void *object)
             depth_or_layer_count = texture->layer_count;
 
         if (resource->format->id != view->format->id
-                || (desc->u.texture.layer_count != 1 && desc->u.texture.layer_count != depth_or_layer_count))
+                || (view->layer_count != 1 && view->layer_count != depth_or_layer_count))
         {
             if (resource->format->gl_view_class != view->format->gl_view_class)
             {
@@ -454,9 +454,9 @@ static HRESULT wined3d_rendertarget_view_init(struct wined3d_rendertarget_view *
     if (resource->type == WINED3D_RTYPE_BUFFER)
     {
         view->sub_resource_idx = 0;
+        view->layer_count = 1;
         view->width = desc->u.buffer.count;
         view->height = 1;
-        view->depth = 1;
     }
     else
     {
@@ -465,9 +465,9 @@ static HRESULT wined3d_rendertarget_view_init(struct wined3d_rendertarget_view *
         view->sub_resource_idx = desc->u.texture.level_idx;
         if (resource->type != WINED3D_RTYPE_TEXTURE_3D)
             view->sub_resource_idx += desc->u.texture.layer_idx * texture->level_count;
+        view->layer_count = desc->u.texture.layer_count;
         view->width = wined3d_texture_get_level_width(texture, desc->u.texture.level_idx);
         view->height = wined3d_texture_get_level_height(texture, desc->u.texture.level_idx);
-        view->depth = desc->u.texture.layer_count;
     }
 
     wined3d_resource_incref(view->resource = resource);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 5050ab4..b40e132 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1643,6 +1643,7 @@ struct wined3d_rendertarget_info
     struct wined3d_gl_view gl_view;
     struct wined3d_resource *resource;
     unsigned int sub_resource_idx;
+    unsigned int layer_count;
 };
 
 #define MAX_GL_FRAGMENT_SAMPLERS 32
@@ -3394,10 +3395,10 @@ struct wined3d_rendertarget_view
     const struct wined3d_format *format;
     unsigned int format_flags;
     unsigned int sub_resource_idx;
+    unsigned int layer_count;
 
     unsigned int width;
     unsigned int height;
-    unsigned int depth;
 
     struct wined3d_view_desc desc;
 };
-- 
2.10.2




More information about the wine-patches mailing list