Hash :
e7da32f1
Author :
Date :
2018-12-27T15:31:47
Fix the failure in UpdateImageTextureInUse If we update the texture data between two dispatch calls, ReadPixels can't get right result after the second dispatch call. The failure reason is that after the first dispatch, ReadPixels will sync framebufer state which will update color render target. Finally, TextureD3D::ensureRenderTarget is reached. However, we are in compute pipeline. mTexStorage->isRenderTarget() will be false. That results the current texture will create a new render target storage. But the UAV is still bound with the previous texture storage. If there is no texture dirty bit between these two dispatch calls, applyTexturesForCompute won't be called. After the second dispatch, readPixels will read data from the new texture storage which is not updated. Bug: angleproject:3015 Change-Id: Ib2494ab8bf6e12faefc0a7370719d383526c36ba Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1390710 Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org> Commit-Queue: Jiajia Qin <jiajia.qin@intel.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
//
// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// TextureStorage.h: Defines the abstract rx::TextureStorage class.
#ifndef LIBANGLE_RENDERER_D3D_TEXTURESTORAGE_H_
#define LIBANGLE_RENDERER_D3D_TEXTURESTORAGE_H_
#include "common/debug.h"
#include "libANGLE/angletypes.h"
#include <GLES2/gl2.h>
#include <stdint.h>
namespace gl
{
class Context;
class ImageIndex;
struct Box;
struct PixelUnpackState;
} // namespace gl
namespace angle
{
class Subject;
} // namespace angle
namespace rx
{
class SwapChainD3D;
class RenderTargetD3D;
class ImageD3D;
class TextureStorage : angle::NonCopyable
{
public:
TextureStorage() {}
virtual ~TextureStorage() {}
virtual angle::Result onDestroy(const gl::Context *context);
virtual int getTopLevel() const = 0;
virtual bool isRenderTarget() const = 0;
virtual bool isManaged() const = 0;
virtual bool supportsNativeMipmapFunction() const = 0;
virtual int getLevelCount() const = 0;
virtual angle::Result getRenderTarget(const gl::Context *context,
const gl::ImageIndex &index,
RenderTargetD3D **outRT) = 0;
virtual angle::Result generateMipmap(const gl::Context *context,
const gl::ImageIndex &sourceIndex,
const gl::ImageIndex &destIndex) = 0;
virtual angle::Result copyToStorage(const gl::Context *context,
TextureStorage *destStorage) = 0;
virtual angle::Result setData(const gl::Context *context,
const gl::ImageIndex &index,
ImageD3D *image,
const gl::Box *destBox,
GLenum type,
const gl::PixelUnpackState &unpack,
const uint8_t *pixelData) = 0;
// This is a no-op for most implementations of TextureStorage. Some (e.g. TextureStorage11_2D)
// might override it.
virtual angle::Result useLevelZeroWorkaroundTexture(const gl::Context *context,
bool useLevelZeroTexture);
virtual void invalidateTextures() {}
protected:
const angle::Subject *mSubject;
};
inline angle::Result TextureStorage::onDestroy(const gl::Context *context)
{
return angle::Result::Continue;
}
inline angle::Result TextureStorage::useLevelZeroWorkaroundTexture(const gl::Context *context,
bool useLevelZeroTexture)
{
return angle::Result::Continue;
}
using TexStoragePointer = angle::UniqueObjectPointer<TextureStorage, gl::Context>;
} // namespace rx
#endif // LIBANGLE_RENDERER_D3D_TEXTURESTORAGE_H_