edit - also that is alot of draw calls.... and you were getting 60fps? Was that on your new machine with the 1080 or the old machine?
60fps? oh, heavans no! <g>
here's the breakdown in brief:
terrain chunks are 300 feet across (~ 100m)
i draw the player's chunk, and the 8 surrounding chunks.
chunks are skipped if off the edge of the world map, or are 100% behind the player, based on player yr. i found it interesting that N-S-E-W chunks only have a 90 degree arc where they are not visible, but diagonal chunks have a 180 degree arc. this is because the player can be anywhere in their chunk, looking in any direction.
a chunk is a list of renderables (Zdrawinfo structs with params for a draw call), with a database styte index that lists them in order by texture. the structs are in an un-ordered arrray. the index is an ordered array of ints (struct indices) sorted on texture.
chunks are drawn one at a time, with each chunk's renderables drawn in order by texture alone. to date this has been sufficiently fast that i don't even bother sorting on mesh or near to far.
for each texture in the chunk, it sets the texture, then draws all the meshes that use it. it sets the mesh, cull, clamp, material, etc, and then calls DIP.
my wrapper API for dx9 includes state managers for things like texture, mesh, cull, clamp, alphatest, etc.
the far plane is set to 1000 feet for the pass that draws grass.
trivial range rejection cliprange is also set to 1000 feet. the player can control clip range for about a dozen different things, including grass.
clipping consists of a trivial range rejection based on bbox distance to the camera, and frustum cull (b-spheres vs planes), for each mesh drawn.
these are the kind of numbers i'm getting on the i7-6700K + gtx1080
one plant every 3 feet, 10,000 plants per chunk, 90,000 plants total before clipping, 60 fps rock solid all day long. but up to a meter between adjacent plants when drawn to scale or even a bit oversized. don't recall the number visible offhand, maybe 3000.
one plant every 2 feet, 22,500 plants per chunk, 202,500 plants total before clipping, about 54-56 fps. again, i don't recall the number visible offhand, perhaps 10k or so. if you really want to know the numbers , i can always kick them back up and tell you what they are. it only takes 15 seconds to make a code change on this new PC. just 20 seconds + edit time from quit game to running game again with recompiled changes. beats the hell out of 3-4 minutes on the old dual core 1.3Ghz PC..
one plant every foot, 90,000 plants per chunk, 810,000 pants total before clipping, about 15 fps. ~98,000 plants visible. i hit 101K+ draw calls total, with about 3000 of them going towards everything except the grass.
as the number of plants increases, the max number of meshes per chunk must increase (from 15K to 95K), and the max number of chunks in the chunk cache must decrease (from 90 to 30) to keep from running out of ram.
each chunk uses 4 different textures for grass. total textures for a chunk is on the order of one to two dozen. 4 ground, 2 tree trunk, 2 tree leaf, a couple rocks, maybe a berry bush or fruit tree, or water, and the grass plants, that's about it.