d3d1x: implement array textures
This commit is contained in:
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user