d3d1x: implement array textures
authorChristoph Bumiller <e0425955@student.tuwien.ac.at>
Thu, 13 Oct 2011 12:40:44 +0000 (14:40 +0200)
committerChristoph Bumiller <e0425955@student.tuwien.ac.at>
Fri, 21 Oct 2011 21:00:37 +0000 (23:00 +0200)
src/gallium/state_trackers/d3d1x/gd3d11/d3d11_context.h
src/gallium/state_trackers/d3d1x/gd3d11/d3d11_screen.h
src/gallium/state_trackers/d3d1x/gd3d1x/sm4_to_tgsi.cpp

index 2cda1ad6423d844e7c7f80b7a1ee65431d4106ed..bbeeb8c3c954a6e83786900eef3876dd6ac0bbf8 100644 (file)
@@ -1667,7 +1667,8 @@ changed:
                        pipe->bind_stream_output_state(pipe, 0);
                if(pipe->render_condition)
                        pipe->render_condition(pipe, 0, 0);
-               util_gen_mipmap(gen_mipmap, view->object, 0, 0, view->object->texture->last_level, PIPE_TEX_FILTER_LINEAR);
+               for(unsigned layer = view->object->u.tex.first_layer; layer <= view->object->u.tex.last_layer; ++layer)
+                       util_gen_mipmap(gen_mipmap, view->object, layer, view->object->u.tex.first_level, view->object->u.tex.last_level, PIPE_TEX_FILTER_LINEAR);
                restore_gallium_state_blit_only();
        }
 
index 33cea8380cda5823c71406c2aba1871f3e322d43..74ad24cf4c333fe68aacbe7c497d4cad15b6d61a 100644 (file)
@@ -689,15 +689,17 @@ struct GalliumD3D11ScreenImpl : public GalliumD3D11Screen
                        if(target != PIPE_TEXTURE_2D)
                                return E_INVALIDARG;
                        target = PIPE_TEXTURE_CUBE;
-
-                       if(array_size != 6)
-                               return E_NOTIMPL;
+                       if(array_size % 6)
+                               return E_INVALIDARG;
                }
-               else
+               else if(array_size > 1)
                {
-                       if(array_size > 1)
-                               return E_NOTIMPL;
-                       array_size = 1;
+                       switch (target) {
+                       case PIPE_TEXTURE_1D: target = PIPE_TEXTURE_1D_ARRAY; break;
+                       case PIPE_TEXTURE_2D: target = PIPE_TEXTURE_2D_ARRAY; break;
+                       default:
+                               return E_INVALIDARG;
+                       }
                }
                /* TODO: msaa */
                struct pipe_resource templat;
@@ -706,6 +708,7 @@ struct GalliumD3D11ScreenImpl : public GalliumD3D11Screen
                templat.width0 = width;
                templat.height0 = height;
                templat.depth0 = depth;
+               templat.array_size = array_size;
                if(mip_levels)
                        templat.last_level = mip_levels - 1;
                else
@@ -956,17 +959,35 @@ struct GalliumD3D11ScreenImpl : public GalliumD3D11Screen
                                def_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1D;
                                def_desc.Texture1D.MipLevels = resource->last_level + 1;
                                break;
+                       case PIPE_TEXTURE_1D_ARRAY:
+                               def_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1DARRAY;
+                               def_desc.Texture1DArray.MipLevels = resource->last_level + 1;
+                               def_desc.Texture1DArray.ArraySize = resource->array_size;
+                               break;
                        case PIPE_TEXTURE_2D:
                        case PIPE_TEXTURE_RECT:
                                def_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
                                def_desc.Texture2D.MipLevels = resource->last_level + 1;
                                break;
+                       case PIPE_TEXTURE_2D_ARRAY:
+                               def_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
+                               def_desc.Texture2DArray.MipLevels = resource->last_level + 1;
+                               def_desc.Texture2DArray.ArraySize = resource->array_size;
+                               break;
                        case PIPE_TEXTURE_3D:
                                def_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D;
                                def_desc.Texture3D.MipLevels = resource->last_level + 1;
                                break;
                        case PIPE_TEXTURE_CUBE:
-                               def_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
+                               if(resource->array_size > 6)
+                               {
+                                       def_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBEARRAY;
+                                       def_desc.TextureCubeArray.NumCubes = resource->array_size / 6;
+                               }
+                               else
+                               {
+                                       def_desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
+                               }
                                def_desc.TextureCube.MipLevels = resource->last_level + 1;
                                break;
                        default:
@@ -990,12 +1011,21 @@ struct GalliumD3D11ScreenImpl : public GalliumD3D11Screen
                templat.texture = ((GalliumD3D11Resource<>*)iresource)->resource;
                switch(desc->ViewDimension)
                {
+               case D3D11_SRV_DIMENSION_TEXTURE1DARRAY:
+               case D3D11_SRV_DIMENSION_TEXTURE2DARRAY:
+               case D3D11_SRV_DIMENSION_TEXTURECUBEARRAY:
+                       templat.u.tex.first_layer = desc->Texture1DArray.FirstArraySlice;
+                       templat.u.tex.last_layer = desc->Texture1DArray.FirstArraySlice + desc->Texture1DArray.ArraySize - 1;
+                       if (desc->ViewDimension == D3D11_SRV_DIMENSION_TEXTURECUBEARRAY) {
+                               templat.u.tex.first_layer *= 6;
+                               templat.u.tex.last_layer *= 6;
+                       }
+                       // fall through
                case D3D11_SRV_DIMENSION_TEXTURE1D:
                case D3D11_SRV_DIMENSION_TEXTURE2D:
                case D3D11_SRV_DIMENSION_TEXTURE3D:
-               case D3D11_SRV_DIMENSION_TEXTURE1DARRAY:
-               case D3D11_SRV_DIMENSION_TEXTURE2DARRAY:
-                       /* yes, this works for all of these types (but TODO: texture arrays) */
+               case D3D11_SRV_DIMENSION_TEXTURECUBE:
+                       // yes, this works for all of these types
                        templat.u.tex.first_level = desc->Texture1D.MostDetailedMip;
                        templat.u.tex.last_level = templat.u.tex.first_level + desc->Texture1D.MipLevels - 1;
                        break;
@@ -1054,10 +1084,18 @@ struct GalliumD3D11ScreenImpl : public GalliumD3D11Screen
                        case PIPE_TEXTURE_1D:
                                def_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE1D;
                                break;
+                       case PIPE_TEXTURE_1D_ARRAY:
+                               def_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE1DARRAY;
+                               def_desc.Texture1DArray.ArraySize = resource->array_size;
+                               break;
                        case PIPE_TEXTURE_2D:
                        case PIPE_TEXTURE_RECT:
                                def_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
                                break;
+                       case PIPE_TEXTURE_2D_ARRAY:
+                               def_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY;
+                               def_desc.Texture2DArray.ArraySize = resource->array_size;
+                               break;
                        case PIPE_TEXTURE_3D:
                                def_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D;
                                def_desc.Texture3D.WSize = resource->depth0;
@@ -1091,15 +1129,13 @@ struct GalliumD3D11ScreenImpl : public GalliumD3D11Screen
                case D3D11_RTV_DIMENSION_TEXTURE3D:
                        templat.u.tex.level = desc->Texture3D.MipSlice;
                        templat.u.tex.first_layer = desc->Texture3D.FirstWSlice;
-                       /* XXX FIXME */
-                       templat.u.tex.last_layer = desc->Texture3D.FirstWSlice;
+                       templat.u.tex.last_layer = desc->Texture3D.FirstWSlice + desc->Texture3D.WSize - 1;
                        break;
                case D3D11_RTV_DIMENSION_TEXTURE1DARRAY:
                case D3D11_RTV_DIMENSION_TEXTURE2DARRAY:
                        templat.u.tex.level = desc->Texture1DArray.MipSlice;
                        templat.u.tex.first_layer = desc->Texture1DArray.FirstArraySlice;
-                       /* XXX FIXME */
-                       templat.u.tex.last_layer = desc->Texture1DArray.FirstArraySlice;
+                       templat.u.tex.last_layer = desc->Texture1DArray.FirstArraySlice + desc->Texture1DArray.ArraySize - 1;
                        break;
                case D3D11_RTV_DIMENSION_BUFFER:
                case D3D11_RTV_DIMENSION_TEXTURE2DMS:
@@ -1138,10 +1174,18 @@ struct GalliumD3D11ScreenImpl : public GalliumD3D11Screen
                        case PIPE_TEXTURE_1D:
                                def_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE1D;
                                break;
+                       case PIPE_TEXTURE_1D_ARRAY:
+                               def_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE1DARRAY;
+                               def_desc.Texture1DArray.ArraySize = resource->array_size;
+                               break;
                        case PIPE_TEXTURE_2D:
                        case PIPE_TEXTURE_RECT:
                                def_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
                                break;
+                       case PIPE_TEXTURE_2D_ARRAY:
+                               def_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY;
+                               def_desc.Texture2DArray.ArraySize = resource->array_size;
+                               break;
                        case PIPE_TEXTURE_CUBE:
                                def_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY;
                                def_desc.Texture2DArray.ArraySize = 6;
@@ -1172,8 +1216,7 @@ struct GalliumD3D11ScreenImpl : public GalliumD3D11Screen
                case D3D11_DSV_DIMENSION_TEXTURE2DARRAY:
                        templat.u.tex.level = desc->Texture1DArray.MipSlice;
                        templat.u.tex.first_layer = desc->Texture1DArray.FirstArraySlice;
-                       /* XXX FIXME */
-                       templat.u.tex.last_layer = desc->Texture1DArray.FirstArraySlice;
+                       templat.u.tex.last_layer = desc->Texture1DArray.FirstArraySlice + desc->Texture1DArray.ArraySize - 1;
                        break;
                case D3D11_DSV_DIMENSION_TEXTURE2DMS:
                case D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY:
index fd54a673248da380ddfd1074c562cbc460269427..b541d922cd46f6b0560f010afe26d88fbcceba4a 100644 (file)
@@ -720,10 +720,18 @@ next:;
                                        targets[idx].first = TGSI_TEXTURE_1D;
                                        targets[idx].second = TGSI_TEXTURE_SHADOW1D;
                                        break;
+                               case SM4_TARGET_TEXTURE1DARRAY:
+                                       targets[idx].first = TGSI_TEXTURE_1D_ARRAY;
+                                       targets[idx].second = TGSI_TEXTURE_SHADOW1D_ARRAY;
+                                       break;
                                case SM4_TARGET_TEXTURE2D:
                                        targets[idx].first = TGSI_TEXTURE_2D;
                                        targets[idx].second = TGSI_TEXTURE_SHADOW2D;
                                        break;
+                               case SM4_TARGET_TEXTURE2DARRAY:
+                                       targets[idx].first = TGSI_TEXTURE_2D_ARRAY;
+                                       targets[idx].second = TGSI_TEXTURE_SHADOW2D_ARRAY;
+                                       break;
                                case SM4_TARGET_TEXTURE3D:
                                        targets[idx].first = TGSI_TEXTURE_3D;
                                        targets[idx].second = 0;