summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRafael Antognolli <rafael.antognolli@intel.com>2018-01-18 17:19:30 -0800
committerRafael Antognolli <rafael.antognolli@intel.com>2018-02-21 10:30:29 -0800
commitf2c1820a0cea6bc34e8be3850e7451c593bff38e (patch)
treebdc51bbfaf04e73ab89ae9d9e557f152e2e48913
parent0e703ac41c1c3ce9bf141b04088963d5b225e228 (diff)
anv: Use clear address for HiZ fast clears too.cnl/fast_clear_rebase2
Store the default clear address for HiZ fast clears on a global bo, and point to it when needed. Signed-off-by: Rafael Antognolli <rafael.antognolli@intel.com>
-rw-r--r--src/intel/vulkan/anv_device.c19
-rw-r--r--src/intel/vulkan/anv_image.c10
-rw-r--r--src/intel/vulkan/anv_private.h1
3 files changed, 27 insertions, 3 deletions
diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c
index 00b0b65333..68003d0168 100644
--- a/src/intel/vulkan/anv_device.c
+++ b/src/intel/vulkan/anv_device.c
@@ -1316,6 +1316,20 @@ anv_device_init_dispatch(struct anv_device *device)
}
}
+static void
+anv_device_init_hiz_clear_batch(struct anv_device *device)
+{
+ anv_bo_init_new(&device->hiz_clear_bo, device, 4096);
+ uint32_t *map = anv_gem_mmap(device, device->hiz_clear_bo.gem_handle,
+ 0, 4096, 0);
+
+ union isl_color_value hiz_clear = { .u32 = { 0, } };
+ hiz_clear.f32[0] = ANV_HZ_FC_VAL;
+
+ memcpy(map, hiz_clear.u32, sizeof(hiz_clear.u32));
+ anv_gem_munmap(map, device->hiz_clear_bo.size);
+}
+
VkResult anv_CreateDevice(
VkPhysicalDevice physicalDevice,
const VkDeviceCreateInfo* pCreateInfo,
@@ -1462,6 +1476,9 @@ VkResult anv_CreateDevice(
anv_device_init_trivial_batch(device);
+ if (device->info.gen >= 10)
+ anv_device_init_hiz_clear_batch(device);
+
anv_scratch_pool_init(device, &device->scratch_pool);
anv_queue_init(device, &device->queue);
@@ -1555,6 +1572,8 @@ void anv_DestroyDevice(
anv_gem_close(device, device->workaround_bo.gem_handle);
anv_gem_close(device, device->trivial_batch_bo.gem_handle);
+ if (device->info.gen >= 10)
+ anv_gem_close(device, device->hiz_clear_bo.gem_handle);
anv_state_pool_finish(&device->surface_state_pool);
anv_state_pool_finish(&device->instruction_state_pool);
diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c
index 6b7ea32cbb..95950f6031 100644
--- a/src/intel/vulkan/anv_image.c
+++ b/src/intel/vulkan/anv_image.c
@@ -1026,10 +1026,14 @@ anv_image_fill_surface_state(struct anv_device *device,
bool use_clear_address = false;
struct anv_address clear_address = { .bo = NULL };
state_inout->clear_address = 0;
- if (device->info.gen >= 10 && aux_usage != ISL_AUX_USAGE_NONE &&
- aux_usage != ISL_AUX_USAGE_HIZ) {
- clear_address = anv_image_get_clear_color_addr(device, image, aspect);
+
+ if (device->info.gen >= 10 && aux_usage != ISL_AUX_USAGE_NONE) {
use_clear_address = true;
+ if (aux_usage == ISL_AUX_USAGE_HIZ) {
+ clear_address = (struct anv_address) { .bo = &device->hiz_clear_bo };
+ } else {
+ clear_address = anv_image_get_clear_color_addr(device, image, aspect);
+ }
}
if (view_usage == ISL_SURF_USAGE_STORAGE_BIT &&
diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h
index 5c077987ce..2fe0c2c596 100644
--- a/src/intel/vulkan/anv_private.h
+++ b/src/intel/vulkan/anv_private.h
@@ -871,6 +871,7 @@ struct anv_device {
struct anv_bo workaround_bo;
struct anv_bo trivial_batch_bo;
+ struct anv_bo hiz_clear_bo;
struct anv_pipeline_cache blorp_shader_cache;
struct blorp_context blorp;