IntRect DeprecatedTextureHostShmemD3D11::GetTileRect(uint32_t aID) const { uint32_t maxSize = GetMaxTextureSizeForFeatureLevel(mDevice->GetFeatureLevel()); uint32_t horizontalTiles = GetRequiredTiles(mSize.width, maxSize); uint32_t verticalTiles = GetRequiredTiles(mSize.height, maxSize); uint32_t verticalTile = aID / horizontalTiles; uint32_t horizontalTile = aID % horizontalTiles; return IntRect(horizontalTile * maxSize, verticalTile * maxSize, horizontalTile < (horizontalTiles - 1) ? maxSize : mSize.width % maxSize, verticalTile < (verticalTiles - 1) ? maxSize : mSize.height % maxSize); }
void DeprecatedTextureHostShmemD3D11::UpdateImpl(const SurfaceDescriptor& aImage, nsIntRegion* aRegion, nsIntPoint* aOffset) { MOZ_ASSERT(aImage.type() == SurfaceDescriptor::TShmem || aImage.type() == SurfaceDescriptor::TMemoryImage); AutoOpenSurface openSurf(OPEN_READ_ONLY, aImage); nsRefPtr<gfxImageSurface> surf = openSurf.GetAsImage(); gfxIntSize size = surf->GetSize(); uint32_t bpp = 0; DXGI_FORMAT dxgiFormat; switch (surf->Format()) { case gfxImageSurface::ImageFormatRGB24: mFormat = FORMAT_B8G8R8X8; dxgiFormat = DXGI_FORMAT_B8G8R8A8_UNORM; bpp = 4; break; case gfxImageSurface::ImageFormatARGB32: mFormat = FORMAT_B8G8R8A8; dxgiFormat = DXGI_FORMAT_B8G8R8A8_UNORM; bpp = 4; break; case gfxImageSurface::ImageFormatA8: mFormat = FORMAT_A8; dxgiFormat = DXGI_FORMAT_A8_UNORM; bpp = 1; break; } mSize = IntSize(size.width, size.height); CD3D11_TEXTURE2D_DESC desc(dxgiFormat, size.width, size.height, 1, 1, D3D11_BIND_SHADER_RESOURCE, D3D11_USAGE_IMMUTABLE); int32_t maxSize = GetMaxTextureSizeForFeatureLevel(mDevice->GetFeatureLevel()); if (size.width <= maxSize && size.height <= maxSize) { D3D11_SUBRESOURCE_DATA initData; initData.pSysMem = surf->Data(); initData.SysMemPitch = surf->Stride(); mDevice->CreateTexture2D(&desc, &initData, byRef(mTextures[0])); mIsTiled = false; } else { mIsTiled = true; uint32_t tileCount = GetRequiredTiles(size.width, maxSize) * GetRequiredTiles(size.height, maxSize); mTileTextures.resize(tileCount); for (uint32_t i = 0; i < tileCount; i++) { IntRect tileRect = GetTileRect(i); desc.Width = tileRect.width; desc.Height = tileRect.height; D3D11_SUBRESOURCE_DATA initData; initData.pSysMem = surf->Data() + tileRect.y * surf->Stride() + tileRect.x * bpp; initData.SysMemPitch = surf->Stride(); mDevice->CreateTexture2D(&desc, &initData, byRef(mTileTextures[i])); } } }
int32_t CompositorD3D11::GetMaxTextureSize() const { return GetMaxTextureSizeForFeatureLevel(mFeatureLevel); }