OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "GrVkGpu.h" | 8 #include "GrVkGpu.h" |
9 | 9 |
10 #include "GrContextOptions.h" | 10 #include "GrContextOptions.h" |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 SkASSERT(kDynamic_GrAccessPattern == accessPattern || | 180 SkASSERT(kDynamic_GrAccessPattern == accessPattern || |
181 kStatic_GrAccessPattern == accessPattern); | 181 kStatic_GrAccessPattern == accessPattern); |
182 buff = GrVkVertexBuffer::Create(this, size, kDynamic_GrAccessPattern
== accessPattern); | 182 buff = GrVkVertexBuffer::Create(this, size, kDynamic_GrAccessPattern
== accessPattern); |
183 break; | 183 break; |
184 case kIndex_GrBufferType: | 184 case kIndex_GrBufferType: |
185 SkASSERT(kDynamic_GrAccessPattern == accessPattern || | 185 SkASSERT(kDynamic_GrAccessPattern == accessPattern || |
186 kStatic_GrAccessPattern == accessPattern); | 186 kStatic_GrAccessPattern == accessPattern); |
187 buff = GrVkIndexBuffer::Create(this, size, kDynamic_GrAccessPattern
== accessPattern); | 187 buff = GrVkIndexBuffer::Create(this, size, kDynamic_GrAccessPattern
== accessPattern); |
188 break; | 188 break; |
189 case kXferCpuToGpu_GrBufferType: | 189 case kXferCpuToGpu_GrBufferType: |
190 SkASSERT(kDynamic_GrAccessPattern == accessPattern || | 190 SkASSERT(kStream_GrAccessPattern == accessPattern); |
191 kStream_GrAccessPattern == accessPattern); | |
192 buff = GrVkTransferBuffer::Create(this, size, GrVkBuffer::kCopyRead_
Type); | 191 buff = GrVkTransferBuffer::Create(this, size, GrVkBuffer::kCopyRead_
Type); |
193 break; | 192 break; |
194 case kXferGpuToCpu_GrBufferType: | 193 case kXferGpuToCpu_GrBufferType: |
195 SkASSERT(kDynamic_GrAccessPattern == accessPattern || | 194 SkASSERT(kStream_GrAccessPattern == accessPattern); |
196 kStream_GrAccessPattern == accessPattern); | |
197 buff = GrVkTransferBuffer::Create(this, size, GrVkBuffer::kCopyWrite
_Type); | 195 buff = GrVkTransferBuffer::Create(this, size, GrVkBuffer::kCopyWrite
_Type); |
198 break; | 196 break; |
199 default: | 197 default: |
200 SkFAIL("Unknown buffer type."); | 198 SkFAIL("Unknown buffer type."); |
201 return nullptr; | 199 return nullptr; |
202 } | 200 } |
203 if (data && buff) { | 201 if (data && buff) { |
204 buff->updateData(data, size); | 202 buff->updateData(data, size); |
205 } | 203 } |
206 return buff; | 204 return buff; |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 } | 277 } |
280 | 278 |
281 if (success) { | 279 if (success) { |
282 vkTex->texturePriv().dirtyMipMaps(true); | 280 vkTex->texturePriv().dirtyMipMaps(true); |
283 return true; | 281 return true; |
284 } | 282 } |
285 | 283 |
286 return false; | 284 return false; |
287 } | 285 } |
288 | 286 |
289 | |
290 bool GrVkGpu::onTransferPixels(GrTexture* texture, | |
291 int left, int top, int width, int height, | |
292 GrPixelConfig config, GrBuffer* transferBuffer, | |
293 size_t bufferOffset, size_t rowBytes) { | |
294 GrVkTexture* vkTex = static_cast<GrVkTexture*>(texture); | |
295 if (!vkTex) { | |
296 return false; | |
297 } | |
298 GrVkTransferBuffer* vkBuffer = static_cast<GrVkTransferBuffer*>(transferBuff
er); | |
299 if (!vkBuffer) { | |
300 return false; | |
301 } | |
302 | |
303 // We assume Vulkan doesn't do sRGB <-> linear conversions when reading and
writing pixels. | |
304 if (GrPixelConfigIsSRGB(texture->config()) != GrPixelConfigIsSRGB(config)) { | |
305 return false; | |
306 } | |
307 | |
308 // TODO: Handle y axis flip via copy to temp image, then blit to final | |
309 if (kBottomLeft_GrSurfaceOrigin == vkTex->origin()) { | |
310 return false; | |
311 } | |
312 | |
313 bool success = false; | |
314 if (GrPixelConfigIsCompressed(vkTex->desc().fConfig)) { | |
315 // We check that config == desc.fConfig in GrGpu::getWritePixelsInfo() | |
316 SkASSERT(config == vkTex->desc().fConfig); | |
317 // TODO: add compressed texture support | |
318 // delete the following two lines and uncomment the two after that when
ready | |
319 vkTex->unref(); | |
320 return false; | |
321 //success = this->uploadCompressedTexData(vkTex->desc(), buffer, false,
left, top, width, | |
322 // height); | |
323 } else { | |
324 // make sure the unmap has finished | |
325 vkBuffer->addMemoryBarrier(this, | |
326 VK_ACCESS_HOST_WRITE_BIT, | |
327 VK_ACCESS_TRANSFER_READ_BIT, | |
328 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, | |
329 VK_PIPELINE_STAGE_TRANSFER_BIT, | |
330 false); | |
331 | |
332 // Set up copy region | |
333 size_t bpp = GrBytesPerPixel(config); | |
334 | |
335 VkBufferImageCopy region; | |
336 memset(®ion, 0, sizeof(VkBufferImageCopy)); | |
337 region.bufferOffset = bufferOffset; | |
338 region.bufferRowLength = (uint32_t)(rowBytes/bpp); | |
339 region.bufferImageHeight = 0; | |
340 region.imageSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1 }; | |
341 region.imageOffset = { left, top, 0 }; | |
342 region.imageExtent = { (uint32_t)width, (uint32_t)height, 1 }; | |
343 | |
344 // Change layout of our target so it can be copied to | |
345 VkImageLayout layout = vkTex->currentLayout(); | |
346 VkPipelineStageFlags srcStageMask = GrVkMemory::LayoutToPipelineStageFla
gs(layout); | |
347 VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT; | |
348 VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(layout); | |
349 VkAccessFlags dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; | |
350 vkTex->setImageLayout(this, | |
351 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, | |
352 srcAccessMask, | |
353 dstAccessMask, | |
354 srcStageMask, | |
355 dstStageMask, | |
356 false); | |
357 | |
358 // Copy the buffer to the image | |
359 fCurrentCmdBuffer->copyBufferToImage(this, | |
360 vkBuffer, | |
361 vkTex, | |
362 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMA
L, | |
363 1, | |
364 ®ion); | |
365 | |
366 // Submit the current command buffer to the Queue | |
367 this->submitCommandBuffer(kSkip_SyncQueue); | |
368 } | |
369 | |
370 if (success) { | |
371 vkTex->texturePriv().dirtyMipMaps(true); | |
372 return true; | |
373 } | |
374 | |
375 return false; | |
376 } | |
377 | |
378 bool GrVkGpu::uploadTexData(GrVkTexture* tex, | 287 bool GrVkGpu::uploadTexData(GrVkTexture* tex, |
379 int left, int top, int width, int height, | 288 int left, int top, int width, int height, |
380 GrPixelConfig dataConfig, | 289 GrPixelConfig dataConfig, |
381 const void* data, | 290 const void* data, |
382 size_t rowBytes) { | 291 size_t rowBytes) { |
383 SkASSERT(data); | 292 SkASSERT(data); |
384 | 293 |
385 // If we're uploading compressed data then we should be using uploadCompress
edTexData | 294 // If we're uploading compressed data then we should be using uploadCompress
edTexData |
386 SkASSERT(!GrPixelConfigIsCompressed(dataConfig)); | 295 SkASSERT(!GrPixelConfigIsCompressed(dataConfig)); |
387 | 296 |
(...skipping 1293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1681 aglSwapBuffers(aglGetCurrentContext()); | 1590 aglSwapBuffers(aglGetCurrentContext()); |
1682 int set_a_break_pt_here = 9; | 1591 int set_a_break_pt_here = 9; |
1683 aglSwapBuffers(aglGetCurrentContext()); | 1592 aglSwapBuffers(aglGetCurrentContext()); |
1684 #elif defined(SK_BUILD_FOR_WIN32) | 1593 #elif defined(SK_BUILD_FOR_WIN32) |
1685 SwapBuf(); | 1594 SwapBuf(); |
1686 int set_a_break_pt_here = 9; | 1595 int set_a_break_pt_here = 9; |
1687 SwapBuf(); | 1596 SwapBuf(); |
1688 #endif | 1597 #endif |
1689 #endif | 1598 #endif |
1690 } | 1599 } |
OLD | NEW |