blob: 2dc82597ed173e7c8750a80fdfecc3116cab60bf [file] [log] [blame]
Chia-I Wu759fa2e2014-08-30 18:44:47 +08001/*
2 * XGL
3 *
4 * Copyright (C) 2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
Chia-I Wu44e42362014-09-02 08:32:09 +080023 *
24 * Authors:
25 * Chia-I Wu <olv@lunarg.com>
Chia-I Wu759fa2e2014-08-30 18:44:47 +080026 */
27
28#include "mem.h"
Chia-I Wue9115ee2014-08-31 12:58:35 +080029#include "event.h"
Chia-I Wu759fa2e2014-08-30 18:44:47 +080030#include "obj.h"
31#include "query.h"
32#include "cmd_priv.h"
33
34static void gen6_MI_STORE_REGISTER_MEM(struct intel_cmd *cmd,
35 struct intel_bo *bo,
36 uint32_t offset,
37 uint32_t reg)
38{
39 const uint8_t cmd_len = 3;
40 uint32_t dw0 = GEN6_MI_CMD(MI_STORE_REGISTER_MEM) |
41 (cmd_len - 2);
Chia-I Wu2caf7492014-08-31 12:28:38 +080042 uint32_t reloc_flags = INTEL_RELOC_WRITE;
Chia-I Wu759fa2e2014-08-30 18:44:47 +080043
Chia-I Wu2caf7492014-08-31 12:28:38 +080044 if (cmd_gen(cmd) == INTEL_GEN(6)) {
Chia-I Wu759fa2e2014-08-30 18:44:47 +080045 dw0 |= GEN6_MI_STORE_REGISTER_MEM_DW0_USE_GGTT;
Chia-I Wu2caf7492014-08-31 12:28:38 +080046 reloc_flags |= INTEL_RELOC_GGTT;
47 }
Chia-I Wu759fa2e2014-08-30 18:44:47 +080048
49 cmd_batch_reserve(cmd, cmd_len);
50 cmd_batch_write(cmd, dw0);
51 cmd_batch_write(cmd, reg);
Chia-I Wu2caf7492014-08-31 12:28:38 +080052 cmd_batch_reloc(cmd, offset, bo, reloc_flags);
Chia-I Wu759fa2e2014-08-30 18:44:47 +080053}
54
55static void gen6_MI_STORE_DATA_IMM(struct intel_cmd *cmd,
56 struct intel_bo *bo,
57 uint32_t offset,
58 uint64_t val)
59{
60 const uint8_t cmd_len = 5;
61 uint32_t dw0 = GEN6_MI_CMD(MI_STORE_DATA_IMM) |
62 (cmd_len - 2);
Chia-I Wu2caf7492014-08-31 12:28:38 +080063 uint32_t reloc_flags = INTEL_RELOC_WRITE;
Chia-I Wu759fa2e2014-08-30 18:44:47 +080064
Chia-I Wu2caf7492014-08-31 12:28:38 +080065 if (cmd_gen(cmd) == INTEL_GEN(6)) {
Chia-I Wu759fa2e2014-08-30 18:44:47 +080066 dw0 |= GEN6_MI_STORE_DATA_IMM_DW0_USE_GGTT;
Chia-I Wu2caf7492014-08-31 12:28:38 +080067 reloc_flags |= INTEL_RELOC_GGTT;
68 }
Chia-I Wu759fa2e2014-08-30 18:44:47 +080069
70 cmd_batch_reserve(cmd, cmd_len);
71 cmd_batch_write(cmd, dw0);
72 cmd_batch_write(cmd, 0);
Chia-I Wu2caf7492014-08-31 12:28:38 +080073 cmd_batch_reloc(cmd, offset, bo, reloc_flags);
Chia-I Wu759fa2e2014-08-30 18:44:47 +080074 cmd_batch_write(cmd, (uint32_t) val);
75 cmd_batch_write(cmd, (uint32_t) (val >> 32));
76}
77
78static void cmd_query_pipeline_statistics(struct intel_cmd *cmd,
79 struct intel_bo *bo,
80 XGL_GPU_SIZE offset)
81{
82 const uint32_t regs[] = {
83 GEN6_REG_PS_INVOCATION_COUNT,
84 GEN6_REG_CL_PRIMITIVES_COUNT,
85 GEN6_REG_CL_INVOCATION_COUNT,
86 GEN6_REG_VS_INVOCATION_COUNT,
87 GEN6_REG_GS_INVOCATION_COUNT,
88 GEN6_REG_GS_PRIMITIVES_COUNT,
Chia-I Wu8a927bd2014-08-31 00:06:36 +080089 /* well, we do not enable 3DSTATE_VF_STATISTICS yet */
Chia-I Wu759fa2e2014-08-30 18:44:47 +080090 GEN6_REG_IA_PRIMITIVES_COUNT,
91 GEN6_REG_IA_VERTICES_COUNT,
92 (cmd_gen(cmd) >= INTEL_GEN(7)) ? GEN6_REG_HS_INVOCATION_COUNT : 0,
93 (cmd_gen(cmd) >= INTEL_GEN(7)) ? GEN6_REG_DS_INVOCATION_COUNT : 0,
94 0,
95 };
96 XGL_UINT i;
97
98 cmd_batch_flush(cmd, GEN6_PIPE_CONTROL_CS_STALL);
99
100 for (i = 0; i < ARRAY_SIZE(regs); i++) {
101 if (regs[i]) {
102 /* store lower 32 bits */
103 gen6_MI_STORE_REGISTER_MEM(cmd, bo, offset, regs[i]);
104 /* store higher 32 bits */
105 gen6_MI_STORE_REGISTER_MEM(cmd, bo, offset + 4, regs[i] + 4);
106 } else {
107 gen6_MI_STORE_DATA_IMM(cmd, bo, offset, 0);
108 }
Chia-I Wu8a927bd2014-08-31 00:06:36 +0800109
110 offset += sizeof(uint64_t);
Chia-I Wu759fa2e2014-08-30 18:44:47 +0800111 }
112}
113
114XGL_VOID XGLAPI intelCmdBeginQuery(
115 XGL_CMD_BUFFER cmdBuffer,
116 XGL_QUERY_POOL queryPool,
117 XGL_UINT slot,
118 XGL_FLAGS flags)
119{
120 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
121 struct intel_query *query = intel_query(queryPool);
122 struct intel_bo *bo = query->obj.mem->bo;
123 const XGL_GPU_SIZE offset = query->slot_stride * slot;
124
125 switch (query->type) {
126 case XGL_QUERY_OCCLUSION:
127 cmd_batch_depth_count(cmd, bo, offset);
128 break;
129 case XGL_QUERY_PIPELINE_STATISTICS:
130 cmd_query_pipeline_statistics(cmd, bo, offset);
131 break;
132 default:
133 cmd->result = XGL_ERROR_UNKNOWN;
134 break;
135 }
136}
137
138XGL_VOID XGLAPI intelCmdEndQuery(
139 XGL_CMD_BUFFER cmdBuffer,
140 XGL_QUERY_POOL queryPool,
141 XGL_UINT slot)
142{
143 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
144 struct intel_query *query = intel_query(queryPool);
145 struct intel_bo *bo = query->obj.mem->bo;
146 const XGL_GPU_SIZE offset = query->slot_stride * slot;
147
148 switch (query->type) {
149 case XGL_QUERY_OCCLUSION:
150 cmd_batch_depth_count(cmd, bo, offset + sizeof(uint64_t));
151 break;
152 case XGL_QUERY_PIPELINE_STATISTICS:
153 cmd_query_pipeline_statistics(cmd, bo,
154 offset + sizeof(XGL_PIPELINE_STATISTICS_DATA));
155 break;
156 default:
157 cmd->result = XGL_ERROR_UNKNOWN;
158 break;
159 }
160}
161
162XGL_VOID XGLAPI intelCmdResetQueryPool(
163 XGL_CMD_BUFFER cmdBuffer,
164 XGL_QUERY_POOL queryPool,
165 XGL_UINT startQuery,
166 XGL_UINT queryCount)
167{
Chia-I Wue9115ee2014-08-31 12:58:35 +0800168 /* no-op */
169}
170
171XGL_VOID XGLAPI intelCmdSetEvent(
172 XGL_CMD_BUFFER cmdBuffer,
173 XGL_EVENT event_)
174{
175 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
176 struct intel_event *event = intel_event(event_);
177
178 cmd_batch_immediate(cmd, event->obj.mem->bo, 0, 1);
179}
180
181XGL_VOID XGLAPI intelCmdResetEvent(
182 XGL_CMD_BUFFER cmdBuffer,
183 XGL_EVENT event_)
184{
185 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
186 struct intel_event *event = intel_event(event_);
187
188 cmd_batch_immediate(cmd, event->obj.mem->bo, 0, 0);
189}
190
191XGL_VOID XGLAPI intelCmdWriteTimestamp(
192 XGL_CMD_BUFFER cmdBuffer,
193 XGL_TIMESTAMP_TYPE timestampType,
194 XGL_GPU_MEMORY destMem,
195 XGL_GPU_SIZE destOffset)
196{
197 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
198 struct intel_mem *mem = intel_mem(destMem);
199
200 switch (timestampType) {
201 case XGL_TIMESTAMP_TOP:
202 /* XXX we are not supposed to use two commands... */
203 gen6_MI_STORE_REGISTER_MEM(cmd, mem->bo, destOffset, GEN6_REG_TIMESTAMP);
204 gen6_MI_STORE_REGISTER_MEM(cmd, mem->bo, destOffset + 4, GEN6_REG_TIMESTAMP + 4);
205 break;
206 case XGL_TIMESTAMP_BOTTOM:
207 cmd_batch_timestamp(cmd, mem->bo, destOffset);
208 break;
209 default:
210 cmd->result = XGL_ERROR_INVALID_VALUE;
211 break;
212 }
Chia-I Wu759fa2e2014-08-30 18:44:47 +0800213}