void CDataView::ProcessAs2D() { size_t dataBytes = m_data.size(); const char* pData = &m_data[0]; const DataSetting2D& setting = dynamic_cast<const DataSetting2D&>(*m_pDataSetting); int width = EvalFormula(setting.widthFormula); if (width <= 0) return; int height = EvalFormula(setting.heightFormula); if (height <= 0) return; int pixelStride; size_t colorFormatPixelSize = GetByteSize(setting.colorFormat); if (setting.bUsePixelStride) { pixelStride = EvalFormula(setting.pixelStrideFormula); if (pixelStride <= 0 || pixelStride < colorFormatPixelSize) { return; } }else { pixelStride = colorFormatPixelSize; } size_t lineBytes = 0; if (setting.colorFormat == ColorFormatType_1) { lineBytes = width / 8 + ((width % 8) ? 1 : 0); }else { lineBytes = width * pixelStride; } int lineStride = setting.bUseLineStride ? EvalFormula(setting.lineStrideFormula) : lineBytes; if (lineStride == 0) return; if (abs(lineStride) < lineBytes) return; if (abs(lineStride)*height != dataBytes) return; const char* pFirstLine = NULL; switch (setting.addressedLine) { case DataSetting2D::AddressedLine_Last: case DataSetting2D::AddressedLine_First: if (lineStride < 0) { pFirstLine = pData + -lineStride * (int)(height - 1); }else { pFirstLine = pData; } break; } if (m_pImage) { if (m_pImage->GetWidth() < width || m_pImage->GetHeight() < height) { DeleteObject(m_hBMP); delete m_pImage; m_pImage = 0; } } if (!m_pImage) { m_hBMP = CreateDIB32(width, -height, m_bmi, m_pBits); m_pImage = gl::BuildBuffer2DFromBMP(m_bmi.bmiHeader, m_pBits); m_memDC.SelectBitmap(m_hBMP); } m_imgWidth = width; m_imgHeight = height; gl::Buffer2D<ColorB8G8R8A8>& img = *(gl::Buffer2D<ColorB8G8R8A8>*)m_pImage; if (setting.colorFormat != ColorFormatType_1 && IsSingleComponent(setting.colorFormat)) { gl::ColorConverterMinMax<ColorB8G8R8A8> colorConverter(EvalFormula(setting.minimumFormula), EvalFormula(setting.maximumFormula)); switch (setting.colorFormat) { case ColorFormatType_F32: gl::BitBlockTransfer(gl::Buffer2D<float>(width, height, lineStride, (void*)pFirstLine), pixelStride, img, 0,0,0,0,width,height, colorConverter); break; case ColorFormatType_F64: gl::BitBlockTransfer(gl::Buffer2D<double>(width, height, lineStride, (void*)pFirstLine), pixelStride, img, 0,0,0,0,width,height, colorConverter); break; case ColorFormatType_U8: gl::BitBlockTransfer(gl::Buffer2D<uint8_t>(width, height, lineStride, (void*)pFirstLine), pixelStride, img, 0,0,0,0,width,height, colorConverter); break; case ColorFormatType_U16: gl::BitBlockTransfer(gl::Buffer2D<uint16_t>(width, height, lineStride, (void*)pFirstLine), pixelStride, img, 0,0,0,0,width,height, colorConverter); break; case ColorFormatType_U32: gl::BitBlockTransfer(gl::Buffer2D<uint32_t>(width, height, lineStride, (void*)pFirstLine), pixelStride, img, 0,0,0,0,width,height, colorConverter); break; case ColorFormatType_S8: gl::BitBlockTransfer(gl::Buffer2D<int8_t>(width, height, lineStride, (void*)pFirstLine), pixelStride, img, 0,0,0,0,width,height, colorConverter); break; case ColorFormatType_S16: gl::BitBlockTransfer(gl::Buffer2D<int16_t>(width, height, lineStride, (void*)pFirstLine), pixelStride, img, 0,0,0,0,width,height, colorConverter); break; case ColorFormatType_S32: gl::BitBlockTransfer(gl::Buffer2D<int32_t>(width, height, lineStride, (void*)pFirstLine), pixelStride, img, 0,0,0,0,width,height, colorConverter); break; } }else { gl::ColorConverter<ColorB8G8R8A8> colorConverter; switch (setting.colorFormat) { case ColorFormatType_1: gl::BitBlockTransfer(gl::Buffer2D<bool>(width, height, lineStride, (void*)pFirstLine), img, 0,0,0,0,width,height, colorConverter); break; case ColorFormatType_B5G6R5: gl::BitBlockTransfer(gl::Buffer2D<ColorB5G6R5>(width, height, lineStride, (void*)pFirstLine), pixelStride, img, 0,0,0,0,width,height, colorConverter); break; case ColorFormatType_B8G8R8: gl::BitBlockTransfer(gl::Buffer2D<ColorB8G8R8>(width, height, lineStride, (void*)pFirstLine), pixelStride, img, 0,0,0,0,width,height, colorConverter); break; case ColorFormatType_B8G8R8A8: gl::BitBlockTransfer(gl::Buffer2D<ColorB8G8R8A8>(width, height, lineStride, (void*)pFirstLine), pixelStride, img, 0,0,0,0,width,height, colorConverter); break; } } }
uint8 DB2FileLoaderRegularImpl::Record::getUInt8(uint32 field, uint32 arrayIndex) const { ASSERT(field < file._header->FieldCount); ASSERT(GetByteSize(field) == 1); return *reinterpret_cast<uint8*>(offset + GetOffset(field) + arrayIndex * sizeof(uint8)); }
void VulkanDebugManager::CopyArrayToTex2DMS(VkImage destMS, VkImage srcArray, VkExtent3D extent, uint32_t layers, uint32_t samples, VkFormat fmt) { if(!m_pDriver->GetDeviceFeatures().shaderStorageImageMultisample || !m_pDriver->GetDeviceFeatures().shaderStorageImageWriteWithoutFormat) return; if(m_Array2MSPipe == VK_NULL_HANDLE) return; if(IsDepthOrStencilFormat(fmt)) { CopyDepthArrayToTex2DMS(destMS, srcArray, extent, layers, samples, fmt); return; } VkDevice dev = m_Device; VkResult vkr = VK_SUCCESS; VkImageView srcView, destView; VkImageViewCreateInfo viewInfo = { VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO, NULL, 0, srcArray, VK_IMAGE_VIEW_TYPE_2D_ARRAY, VK_FORMAT_UNDEFINED, {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY}, { VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0, VK_REMAINING_ARRAY_LAYERS, }, }; uint32_t bs = GetByteSize(1, 1, 1, fmt, 0); if(bs == 1) viewInfo.format = VK_FORMAT_R8_UINT; else if(bs == 2) viewInfo.format = VK_FORMAT_R16_UINT; else if(bs == 4) viewInfo.format = VK_FORMAT_R32_UINT; else if(bs == 8) viewInfo.format = VK_FORMAT_R32G32_UINT; else if(bs == 16) viewInfo.format = VK_FORMAT_R32G32B32A32_UINT; if(viewInfo.format == VK_FORMAT_UNDEFINED) { RDCERR("Can't copy Array to MS with format %s", ToStr(fmt).c_str()); return; } if(IsStencilOnlyFormat(fmt)) viewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT; else if(IsDepthOrStencilFormat(fmt)) viewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; vkr = ObjDisp(dev)->CreateImageView(Unwrap(dev), &viewInfo, NULL, &srcView); RDCASSERTEQUAL(vkr, VK_SUCCESS); viewInfo.image = destMS; viewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D_ARRAY; vkr = ObjDisp(dev)->CreateImageView(Unwrap(dev), &viewInfo, NULL, &destView); RDCASSERTEQUAL(vkr, VK_SUCCESS); VkDescriptorImageInfo srcdesc = {0}; srcdesc.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; srcdesc.imageView = srcView; srcdesc.sampler = Unwrap(m_ArrayMSSampler); // not used - we use texelFetch VkDescriptorImageInfo destdesc = {0}; destdesc.imageLayout = VK_IMAGE_LAYOUT_GENERAL; destdesc.imageView = destView; VkWriteDescriptorSet writeSet[] = { {VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, NULL, Unwrap(m_ArrayMSDescSet), 0, 0, 1, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, &srcdesc, NULL, NULL}, {VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, NULL, Unwrap(m_ArrayMSDescSet), 2, 0, 1, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, &destdesc, NULL, NULL}, }; ObjDisp(dev)->UpdateDescriptorSets(Unwrap(dev), ARRAY_COUNT(writeSet), writeSet, 0, NULL); VkCommandBuffer cmd = m_pDriver->GetNextCmd(); VkCommandBufferBeginInfo beginInfo = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, NULL, VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT}; ObjDisp(cmd)->BeginCommandBuffer(Unwrap(cmd), &beginInfo); ObjDisp(cmd)->CmdBindPipeline(Unwrap(cmd), VK_PIPELINE_BIND_POINT_COMPUTE, Unwrap(m_Array2MSPipe)); ObjDisp(cmd)->CmdBindDescriptorSets(Unwrap(cmd), VK_PIPELINE_BIND_POINT_COMPUTE, Unwrap(m_ArrayMSPipeLayout), 0, 1, UnwrapPtr(m_ArrayMSDescSet), 0, NULL); Vec4u params = {samples, 0, 0, 0}; ObjDisp(cmd)->CmdPushConstants(Unwrap(cmd), Unwrap(m_ArrayMSPipeLayout), VK_SHADER_STAGE_ALL, 0, sizeof(Vec4u), ¶ms); ObjDisp(cmd)->CmdDispatch(Unwrap(cmd), extent.width, extent.height, layers * samples); ObjDisp(cmd)->EndCommandBuffer(Unwrap(cmd)); // submit cmds and wait for idle so we can readback m_pDriver->SubmitCmds(); m_pDriver->FlushQ(); ObjDisp(dev)->DestroyImageView(Unwrap(dev), srcView, NULL); ObjDisp(dev)->DestroyImageView(Unwrap(dev), destView, NULL); }
size_t GetCompressedByteSize(GLsizei w, GLsizei h, GLsizei d, GLenum internalformat, int mip) { if(!IsCompressedFormat(internalformat)) { RDCERR("Not compressed format %s", ToStr::Get(internalformat).c_str()); return GetByteSize(w, h, d, GetBaseFormat(internalformat), GetDataType(internalformat)); } uint32_t astc[2] = {0, 0}; switch(internalformat) { // BC1 case eGL_COMPRESSED_RGB_S3TC_DXT1_EXT: case eGL_COMPRESSED_RGBA_S3TC_DXT1_EXT: case eGL_COMPRESSED_SRGB_S3TC_DXT1_EXT: case eGL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: return (AlignUp4(w) * AlignUp4(h) * d) / 2; // BC2 case eGL_COMPRESSED_RGBA_S3TC_DXT3_EXT: case eGL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: return (AlignUp4(w) * AlignUp4(h) * d); // BC3 case eGL_COMPRESSED_RGBA_S3TC_DXT5_EXT: case eGL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: return (AlignUp4(w) * AlignUp4(h) * d); // BC4 case eGL_COMPRESSED_RED_RGTC1: case eGL_COMPRESSED_SIGNED_RED_RGTC1: return (AlignUp4(w) * AlignUp4(h) * d) / 2; // BC5 case eGL_COMPRESSED_RG_RGTC2: case eGL_COMPRESSED_SIGNED_RG_RGTC2: return (AlignUp4(w) * AlignUp4(h) * d); // BC6 case eGL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB: case eGL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB: return (AlignUp4(w) * AlignUp4(h) * d); // BC7 case eGL_COMPRESSED_RGBA_BPTC_UNORM_ARB: case eGL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB: return (AlignUp4(w) * AlignUp4(h) * d); // ETC2 case eGL_COMPRESSED_RGB8_ETC2: case eGL_COMPRESSED_SRGB8_ETC2: case eGL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2: case eGL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: return (AlignUp4(w) * AlignUp4(h) * d) / 2; // EAC case eGL_COMPRESSED_RGBA8_ETC2_EAC: case eGL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC: return (AlignUp4(w) * AlignUp4(h) * d); case eGL_COMPRESSED_R11_EAC: case eGL_COMPRESSED_SIGNED_R11_EAC: return (AlignUp4(w) * AlignUp4(h) * d) / 2; case eGL_COMPRESSED_RG11_EAC: case eGL_COMPRESSED_SIGNED_RG11_EAC: return (AlignUp4(w) * AlignUp4(h) * d); case GL_COMPRESSED_RGBA_ASTC_4x4_KHR: astc[0] = 4; astc[1] = 4; break; case GL_COMPRESSED_RGBA_ASTC_5x4_KHR: astc[0] = 5; astc[1] = 4; break; case GL_COMPRESSED_RGBA_ASTC_5x5_KHR: astc[0] = 5; astc[1] = 5; break; case GL_COMPRESSED_RGBA_ASTC_6x5_KHR: astc[0] = 6; astc[1] = 5; break; case GL_COMPRESSED_RGBA_ASTC_6x6_KHR: astc[0] = 6; astc[1] = 6; break; case GL_COMPRESSED_RGBA_ASTC_8x5_KHR: astc[0] = 8; astc[1] = 5; break; case GL_COMPRESSED_RGBA_ASTC_8x6_KHR: astc[0] = 8; astc[1] = 6; break; case GL_COMPRESSED_RGBA_ASTC_8x8_KHR: astc[0] = 8; astc[1] = 8; break; case GL_COMPRESSED_RGBA_ASTC_10x5_KHR: astc[0] = 10; astc[1] = 5; break; case GL_COMPRESSED_RGBA_ASTC_10x6_KHR: astc[0] = 10; astc[1] = 6; break; case GL_COMPRESSED_RGBA_ASTC_10x8_KHR: astc[0] = 10; astc[1] = 8; break; case GL_COMPRESSED_RGBA_ASTC_10x10_KHR: astc[0] = 10; astc[1] = 10; break; case GL_COMPRESSED_RGBA_ASTC_12x10_KHR: astc[0] = 12; astc[1] = 10; break; case GL_COMPRESSED_RGBA_ASTC_12x12_KHR: astc[0] = 12; astc[1] = 12; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR: astc[0] = 4; astc[1] = 4; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR: astc[0] = 5; astc[1] = 4; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR: astc[0] = 5; astc[1] = 5; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR: astc[0] = 6; astc[1] = 5; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR: astc[0] = 6; astc[1] = 6; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR: astc[0] = 8; astc[1] = 5; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR: astc[0] = 8; astc[1] = 6; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR: astc[0] = 8; astc[1] = 8; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR: astc[0] = 10; astc[1] = 5; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR: astc[0] = 10; astc[1] = 6; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR: astc[0] = 10; astc[1] = 8; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR: astc[0] = 10; astc[1] = 10; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR: astc[0] = 12; astc[1] = 10; break; case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR: astc[0] = 12; astc[1] = 12; break; default: break; } if(astc[0] > 0 && astc[1] > 0) { uint32_t blocks[2] = {(w / astc[0]), (h / astc[1])}; // how many blocks are needed - including any extra partial blocks blocks[0] += (w % astc[0]) ? 1 : 0; blocks[1] += (h % astc[1]) ? 1 : 0; // ASTC blocks are all 128 bits each return blocks[0] * blocks[1] * 16 * d; } RDCERR("Unrecognised compressed format %s", ToStr::Get(internalformat).c_str()); return GetByteSize(w, h, d, GetBaseFormat(internalformat), GetDataType(internalformat)); }
SourceSurfaceD2D::~SourceSurfaceD2D() { if (mBitmap) { DrawTargetD2D::mVRAMUsageSS -= GetByteSize(); } }
bool WrappedOpenGL::Serialise_wglDXLockObjectsNV(SerialiserType &ser, GLResource Resource) { SERIALISE_ELEMENT(Resource); SERIALISE_ELEMENT_LOCAL(textype, Resource.Namespace == eResBuffer ? eGL_NONE : m_Textures[GetResourceManager()->GetID(Resource)].curType) .Hidden(); const GLHookSet &gl = m_Real; // buffer contents are easier to save if(textype == eGL_NONE) { byte *Contents = NULL; uint32_t length = 1; // while writing, fetch the buffer's size and contents if(ser.IsWriting()) { gl.glGetNamedBufferParameterivEXT(Resource.name, eGL_BUFFER_SIZE, (GLint *)&length); Contents = new byte[length]; GLuint oldbuf = 0; gl.glGetIntegerv(eGL_COPY_READ_BUFFER_BINDING, (GLint *)&oldbuf); gl.glBindBuffer(eGL_COPY_READ_BUFFER, Resource.name); gl.glGetBufferSubData(eGL_COPY_READ_BUFFER, 0, (GLsizeiptr)length, Contents); gl.glBindBuffer(eGL_COPY_READ_BUFFER, oldbuf); } SERIALISE_ELEMENT_ARRAY(Contents, length); SERIALISE_CHECK_READ_ERRORS(); // restore on replay if(IsReplayingAndReading()) { uint32_t liveLength = 1; gl.glGetNamedBufferParameterivEXT(Resource.name, eGL_BUFFER_SIZE, (GLint *)&liveLength); gl.glNamedBufferSubData(Resource.name, 0, (GLsizeiptr)RDCMIN(length, liveLength), Contents); } } else { GLuint ppb = 0, pub = 0; PixelPackState pack; PixelUnpackState unpack; // save and restore pixel pack/unpack state. We only need one or the other but for clarity we // push and pop both always. if(ser.IsWriting() || !IsStructuredExporting(m_State)) { gl.glGetIntegerv(eGL_PIXEL_PACK_BUFFER_BINDING, (GLint *)&ppb); gl.glGetIntegerv(eGL_PIXEL_UNPACK_BUFFER_BINDING, (GLint *)&pub); gl.glBindBuffer(eGL_PIXEL_PACK_BUFFER, 0); gl.glBindBuffer(eGL_PIXEL_UNPACK_BUFFER, 0); pack.Fetch(&gl, false); unpack.Fetch(&gl, false); ResetPixelPackState(gl, false, 1); ResetPixelUnpackState(gl, false, 1); } TextureData &details = m_Textures[GetResourceManager()->GetID(Resource)]; GLuint tex = Resource.name; // serialise the metadata for convenience SERIALISE_ELEMENT_LOCAL(internalFormat, details.internalFormat).Hidden(); SERIALISE_ELEMENT_LOCAL(width, details.width).Hidden(); SERIALISE_ELEMENT_LOCAL(height, details.height).Hidden(); SERIALISE_ELEMENT_LOCAL(depth, details.depth).Hidden(); RDCASSERT(internalFormat == details.internalFormat, internalFormat, details.internalFormat); RDCASSERT(width == details.width, width, details.width); RDCASSERT(height == details.height, height, details.height); RDCASSERT(depth == details.depth, depth, details.depth); GLenum fmt = GetBaseFormat(internalFormat); GLenum type = GetDataType(internalFormat); GLint dim = details.dimension; uint32_t size = (uint32_t)GetByteSize(width, height, depth, fmt, type); int mips = 0; if(IsReplayingAndReading()) mips = GetNumMips(gl, textype, tex, width, height, depth); byte *scratchBuf = NULL; // on read and write, we allocate a single buffer big enough for all mips and re-use it // to avoid repeated new/free. scratchBuf = AllocAlignedBuffer(size); GLuint prevtex = 0; if(!IsStructuredExporting(m_State)) { gl.glGetIntegerv(TextureBinding(details.curType), (GLint *)&prevtex); gl.glBindTexture(textype, tex); } for(int i = 0; i < mips; i++) { int w = RDCMAX(details.width >> i, 1); int h = RDCMAX(details.height >> i, 1); int d = RDCMAX(details.depth >> i, 1); if(textype == eGL_TEXTURE_CUBE_MAP_ARRAY || textype == eGL_TEXTURE_1D_ARRAY || textype == eGL_TEXTURE_2D_ARRAY) d = details.depth; size = (uint32_t)GetByteSize(w, h, d, fmt, type); GLenum targets[] = { eGL_TEXTURE_CUBE_MAP_POSITIVE_X, eGL_TEXTURE_CUBE_MAP_NEGATIVE_X, eGL_TEXTURE_CUBE_MAP_POSITIVE_Y, eGL_TEXTURE_CUBE_MAP_NEGATIVE_Y, eGL_TEXTURE_CUBE_MAP_POSITIVE_Z, eGL_TEXTURE_CUBE_MAP_NEGATIVE_Z, }; int count = ARRAY_COUNT(targets); if(textype != eGL_TEXTURE_CUBE_MAP) { targets[0] = textype; count = 1; } for(int trg = 0; trg < count; trg++) { if(ser.IsWriting()) { // we avoid glGetTextureImageEXT as it seems buggy for cubemap faces gl.glGetTexImage(targets[trg], i, fmt, type, scratchBuf); } // serialise without allocating memory as we already have our scratch buf sized. ser.Serialise("SubresourceContents", scratchBuf, size, SerialiserFlags::NoFlags); if(IsReplayingAndReading() && !ser.IsErrored()) { if(dim == 1) gl.glTextureSubImage1DEXT(tex, targets[trg], i, 0, w, fmt, type, scratchBuf); else if(dim == 2) gl.glTextureSubImage2DEXT(tex, targets[trg], i, 0, 0, w, h, fmt, type, scratchBuf); else if(dim == 3) gl.glTextureSubImage3DEXT(tex, targets[trg], i, 0, 0, 0, w, h, d, fmt, type, scratchBuf); } } } FreeAlignedBuffer(scratchBuf); // restore pixel (un)packing state if(ser.IsWriting() || !IsStructuredExporting(m_State)) { gl.glBindBuffer(eGL_PIXEL_PACK_BUFFER, ppb); gl.glBindBuffer(eGL_PIXEL_UNPACK_BUFFER, pub); pack.Apply(&gl, false); unpack.Apply(&gl, false); } if(!IsStructuredExporting(m_State)) gl.glBindTexture(textype, prevtex); SERIALISE_CHECK_READ_ERRORS(); } return true; }
FetchTexture D3D12Replay::GetTexture(ResourceId id) { FetchTexture ret; ret.ID = m_pDevice->GetResourceManager()->GetOriginalID(id); auto it = WrappedID3D12Resource::m_List.find(id); if(it == WrappedID3D12Resource::m_List.end()) return ret; D3D12_RESOURCE_DESC desc = it->second->GetDesc(); ret.format = MakeResourceFormat(desc.Format); ret.dimension = desc.Dimension - D3D12_RESOURCE_DIMENSION_BUFFER; ret.width = (uint32_t)desc.Width; ret.height = desc.Height; ret.depth = desc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D ? desc.DepthOrArraySize : 1; ret.arraysize = desc.Dimension != D3D12_RESOURCE_DIMENSION_TEXTURE3D ? desc.DepthOrArraySize : 1; ret.numSubresources = GetNumSubresources(&desc); ret.mips = desc.MipLevels; ret.msQual = desc.SampleDesc.Quality; ret.msSamp = desc.SampleDesc.Count; ret.byteSize = 0; for(uint32_t i = 0; i < ret.mips; i++) ret.byteSize += GetByteSize(ret.width, ret.height, ret.depth, desc.Format, i); switch(ret.dimension) { case 1: ret.resType = ret.arraysize > 1 ? eResType_Texture1DArray : eResType_Texture1D; break; case 2: if(ret.msSamp > 1) ret.resType = ret.arraysize > 1 ? eResType_Texture2DMSArray : eResType_Texture2DMS; else ret.resType = ret.arraysize > 1 ? eResType_Texture2DArray : eResType_Texture2D; break; case 3: ret.resType = eResType_Texture3D; break; } // TODO determine this from usage? ret.cubemap = false; // eResType_TextureCube, eResType_TextureCubeArray ret.creationFlags = eTextureCreate_SRV; if(desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET) ret.creationFlags |= eTextureCreate_RTV; if(desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL) ret.creationFlags |= eTextureCreate_DSV; if(desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS) ret.creationFlags |= eTextureCreate_UAV; if(ret.ID == m_pDevice->GetQueue()->GetBackbufferResourceID()) { ret.format = MakeResourceFormat(GetTypedFormat(desc.Format, eCompType_UNorm)); ret.creationFlags |= eTextureCreate_SwapBuffer; } ret.customName = true; string str = ""; // TODO GetName(it.second); if(str == "") { const char *suffix = ""; const char *ms = ""; if(ret.msSamp > 1) ms = "MS"; if(ret.creationFlags & eTextureCreate_RTV) suffix = " RTV"; if(ret.creationFlags & eTextureCreate_DSV) suffix = " DSV"; ret.customName = false; if(ret.arraysize > 1) str = StringFormat::Fmt("Texture%uD%sArray%s %llu", ret.dimension, ms, suffix, ret.ID); else str = StringFormat::Fmt("Texture%uD%s%s %llu", ret.dimension, ms, suffix, ret.ID); } ret.name = str; return ret; }