xref: /aosp_15_r20/external/mesa3d/src/gallium/drivers/svga/svga_resource.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright (c) 2008-2024 Broadcom. All Rights Reserved.
3  * The term “Broadcom” refers to Broadcom Inc.
4  * and/or its subsidiaries.
5  * SPDX-License-Identifier: MIT
6  */
7 
8 #include "util/u_debug.h"
9 
10 #include "svga_resource.h"
11 #include "svga_resource_buffer.h"
12 #include "svga_resource_texture.h"
13 #include "svga_context.h"
14 #include "svga_screen.h"
15 #include "svga_format.h"
16 
17 
18 /**
19  * This is the primary driver entrypoint for allocating graphics memory
20  * (vertex/index/constant buffers, textures, etc)
21  */
22 static struct pipe_resource *
svga_resource_create(struct pipe_screen * screen,const struct pipe_resource * template)23 svga_resource_create(struct pipe_screen *screen,
24                      const struct pipe_resource *template)
25 {
26    struct pipe_resource *r;
27 
28    if (template->target == PIPE_BUFFER)
29       r = svga_buffer_create(screen, template);
30    else
31       r = svga_texture_create(screen, template);
32 
33    if (!r) {
34       struct svga_screen *svgascreen = svga_screen(screen);
35       svgascreen->hud.num_failed_allocations++;
36    }
37 
38    return r;
39 }
40 
41 
42 static struct pipe_resource *
svga_resource_from_handle(struct pipe_screen * screen,const struct pipe_resource * template,struct winsys_handle * whandle,unsigned usage)43 svga_resource_from_handle(struct pipe_screen * screen,
44                           const struct pipe_resource *template,
45                           struct winsys_handle *whandle,
46                           unsigned usage)
47 {
48    if (template->target == PIPE_BUFFER)
49       return NULL;
50    else
51       return svga_texture_from_handle(screen, template, whandle);
52 }
53 
54 
55 /**
56  * Check if a resource (texture, buffer) of the given size
57  * and format can be created.
58  * \Return TRUE if OK, FALSE if too large.
59  */
60 static bool
svga_can_create_resource(struct pipe_screen * screen,const struct pipe_resource * res)61 svga_can_create_resource(struct pipe_screen *screen,
62                          const struct pipe_resource *res)
63 {
64    struct svga_screen *svgascreen = svga_screen(screen);
65    struct svga_winsys_screen *sws = svgascreen->sws;
66    SVGA3dSurfaceFormat format;
67    SVGA3dSize base_level_size;
68    uint32 numMipLevels;
69    uint32 arraySize;
70    uint32 numSamples;
71 
72    if (res->target == PIPE_BUFFER) {
73       format = SVGA3D_BUFFER;
74       base_level_size.width = res->width0;
75       base_level_size.height = 1;
76       base_level_size.depth = 1;
77       numMipLevels = 1;
78       arraySize = 1;
79       numSamples = 0;
80 
81    } else {
82       if (res->target == PIPE_TEXTURE_CUBE)
83          assert(res->array_size == 6);
84 
85       format = svga_translate_format(svgascreen, res->format, res->bind);
86       if (format == SVGA3D_FORMAT_INVALID)
87          return false;
88 
89       base_level_size.width = res->width0;
90       base_level_size.height = res->height0;
91       base_level_size.depth = res->depth0;
92       numMipLevels = res->last_level + 1;
93       arraySize = res->array_size;
94       numSamples = res->nr_samples;
95    }
96 
97    return sws->surface_can_create(sws, format, base_level_size,
98                                   arraySize, numMipLevels, numSamples);
99 }
100 
101 
102 void
svga_init_resource_functions(struct svga_context * svga)103 svga_init_resource_functions(struct svga_context *svga)
104 {
105    svga->pipe.buffer_map = svga_buffer_transfer_map;
106    svga->pipe.texture_map = svga_texture_transfer_map;
107    svga->pipe.transfer_flush_region = svga_buffer_transfer_flush_region;
108    svga->pipe.buffer_unmap = svga_buffer_transfer_unmap;
109    svga->pipe.texture_unmap = svga_texture_transfer_unmap;
110    svga->pipe.buffer_subdata = u_default_buffer_subdata;
111    svga->pipe.texture_subdata = u_default_texture_subdata;
112 
113    if (svga_have_vgpu10(svga)) {
114       svga->pipe.generate_mipmap = svga_texture_generate_mipmap;
115    } else {
116       svga->pipe.generate_mipmap = NULL;
117    }
118 }
119 
120 void
svga_init_screen_resource_functions(struct svga_screen * is)121 svga_init_screen_resource_functions(struct svga_screen *is)
122 {
123    is->screen.resource_create = svga_resource_create;
124    is->screen.resource_from_handle = svga_resource_from_handle;
125    is->screen.resource_get_handle = svga_resource_get_handle;
126    is->screen.resource_destroy = svga_resource_destroy;
127    is->screen.can_create_resource = svga_can_create_resource;
128 }
129